如果我正在编写.NET代码,那么我经常会揭露IEnumerable<T>
任何可能有意义的地方。也许这取决于LINQ和您可以使用foreach的事实,但是这样做是“正确的”。
private List<String> _myList;
public IEnumerable<String> MyList
{
get { return _myList; }
}
现在,我正在编写Java
8代码,并在辩论是否应该以Stream<T>
相同的方式进行公开?也许是因为我必须打电话给我Collection.stream()
,感觉就像是在“工作”,但感觉不对吗?
private Collection<String> myCollection;
public Stream<String> getStuff() {
return myCollection.stream();
}
是否Stream<T>
应该以IEnumerable<T>
可能相同的方式在接口上公开?
您在问错问题。毕竟,同时支持这两者并不难,例如
Collection<Foo> getStuff();
default Stream<Foo> stuff() {
return getStuff().stream();
}
因此使用您的界面的代码不需要显式stream()
调用,而实现者interface
也无需理会它。
由于您总是Stream
通过Collection.stream()
或显式地提供支持,因此问题是您是否要
公开Collection
。虽然Stream
为Collection
后端提供a便宜,Collection
但从a
收集a却很昂贵Stream
。
因此,公开两种方式的接口都表明它们同等可用,而对于不使用Collection
后端的实现,这些方式中的一种可能比另一种昂贵。
因此,如果您确定所有实现(包括将来的实现)将始终使用(或必须支持)Collection
,尽管API作为Collection
支持某些Stream
不支持的操作,将其公开可能会很有用。如果您支持通过暴露的修改基础数据,则尤其如此Collection
。
否则,Stream
仅支持访问可能是更好的选择。这使实现可以自由使用除a之外的其他后端Collection
。但是,这也意味着此API不支持Java
8之前的Java版本。
如果我正在编写.NET代码,我通常会公开
问题内容: 在为数据库(例如MySQL)设计模式时,会出现一个问题,即是否要完全规范化表。 一方面,联接(以及外键约束等)非常慢,另一方面,您会获得冗余数据和潜在的不一致情况。 这里“最优化”是正确的方法吗?即创建一个书本归一化数据库,然后查看可以进行归一化以实现最佳速度增益的内容。 对于这种方法,我的担心是,我将选择一个可能不够快的数据库设计- 但是在那个阶段重构模式(同时支持现有数据)将非常痛
问题内容: 我使用a 将字符串转换为可以上传到SFTP服务器的文件(需要流)。事后结束这一点有什么意义吗?据我在源代码中看到的,它只是将字符串设置为… 我可以这样做,但是由于将close方法标记为throw,并且我只需要将其包装在try catch中,代码最终看起来比可能需要的可怕得多。 问题答案: 如果您知道要处理的是您将要扔掉的产品,那么我看不出有什么理由要关闭它。我无法想象关闭它后会保留对它
问题内容: 在我们的代码库中找到以下代码: 在这里,将创建一个默认值,然后使用该默认值为另一个种子创建种子,该种子将在本课程的稍后版本中使用。这真的有必要吗?因为这样做了,第二个比第一个好吗? 当第二秒生成种子时,给出了字节数,这重要吗?难道一个比另一个不同数量的字节播种可能是好还是坏?用于播种的字节数是否应该与将用于的字节数相对应? 如果未调用setSeed,则对nextBytes的第一次调用将
我有一个SQL语句,我希望它返回一行,因为我正在传递主键。所以我的选择是 将queryForObject包装为try/catch,捕获EmptyResultDataAccessException,并返回null 将调用更改为queryForList,然后展开列表,并(希望)返回第一个元素,或null 我在某个地方读到过,将EmptyResultDataAccessException作为cathin
我今天有一个讨论,我的一些同事说他们像这样注入他们的 Angular 服务: 他们说他们这样做是因为它阻止了我的组件的消费者更改注入的服务,有点像: 因此,虽然从技术上讲他们是对的,但我仍然不相信我应该这样做。我问自己以下问题: > DI是Angular的基础部分,如果有人真的这么做了,这个人是应该更好地跑进这个坑里失败还是应该他/她根本做不到这一点 在这种情况下, 对于出于几个原因开始学习 An