当前位置: 首页 > 知识库问答 >
问题:

我应该在我的界面上公开流<T>吗?

柳星晖
2023-03-14

如果我正在编写.NET代码,我通常会公开IEnumerable

private List<String> _myList;

public IEnumerable<String> MyList
{
    get { return _myList; }
}

现在,我正在编写Java8代码,我正在讨论是否应该公开<code>流

private Collection<String> myCollection;

public Stream<String> getStuff() {
    return myCollection.stream();
}

是<代码>流


共有3个答案

万俟渊
2023-03-14

在接口中尽可能避免流。

流可以*是有限的或无限的*是顺序的或平行的*是有序的或非有序的*需要关闭或不关闭

接口的实现者和接口的客户端都不知道应该(不)应用这些特性中的哪些,或者他们需要防范哪些。

在接口中选择最灵活的返回类型只意味着客户机承担了防范所有可能性的全部责任。在接口中,通常更有用的是限制返回的数据类型,以便实现者知道他们可以依赖什么假设(出于同样的原因,返回<code>Collection

当您需要更改返回数据的特征时,更改接口,b故意中断客户机,以便他们可以根据更改的情况更新算法。

这比说:“我的方法返回一个Stream,所以现在我可以返回一个无限的流而不是一个有限的流,并且客户端代码仍然编译,多么美妙!这并不美妙,这样做是一个可怕的错误来源。客户端代码不应该继续以如此剧烈的变化进行编译,因此使用明确关于有限性,并行性,有序性和关闭()义务的数据类型是一个更好的选择。

这样想:如果保持灵活性非常好,那么Java7中返回<code>List

顾承平
2023-03-14

您是否想自己成为Stream,主要取决于您是否真正是一个具有相应功能的Stream,即支持并行化(并非所有Streams都这样做,但这是Streams的众多好处之一,而且很重要)。通常我宁愿成为Collection并让自己被相应的API调用Stream编辑。

方法,返回

濮阳赞
2023-03-14

你问错了问题。毕竟,支持两者并不难,例如

Collection<Foo> getStuff();
default Stream<Foo> stuff() {
    return getStuff().stream();
}

因此,使用接口的代码不需要显式 stream() 调用,而接口的实现者也不需要为此烦恼。

由于您始终通过 Collection.stream() 或显式公开支持,因此问题是是否要公开集合。虽然为集合后端提供很便宜,但从中收集集合可能会很昂贵。

因此,公开这两种方法的接口表明它们同样可用,而对于不使用<code>集合</code>后端的实现,其中一种方法可能比另一种方法昂贵得多。

因此,如果您确定所有实现,包括未来的实现,都将始终使用(或必须支持)Collection,那么通过API将其公开为Collection可能会很有用。s支持Stream不支持的某些操作。如果您支持通过公开的Collection修改底层数据,则尤其如此。

否则,仅支持Stream访问可能是更好的选择。这使实现可以自由地拥有Collection以外的其他后端。但是,这也意味着此API不支持Java之前的Java版本

 类似资料:
  • 问题内容: 如果我正在编写.NET代码,那么我经常会揭露任何可能有意义的地方。也许这取决于LINQ和您可以使用foreach的事实,但是这样做是“正确的”。 现在,我正在编写Java 8代码,并在辩论是否应该以相同的方式进行公开?也许是因为我必须打电话给我,感觉就像是在“工作”,但感觉不对吗? 是否应该以可能相同的方式在接口上公开? 问题答案: 您在问错问题。毕竟,同时支持这两者并不难,例如 因此

  • 这是如何显示当我试图在我的phpMyAdmin

  • 问题内容: 两种方法中的哪一种符合W3C标准?它们在浏览器中的表现均符合预期吗? 边界:无; 边界:0; 问题答案: 两者均有效。 这是你的选择。 我喜欢,因为它更短。我觉得这更容易阅读。您可能会发现更清晰。我们生活在功能强大的CSS后处理器世界中,因此我建议您使用您喜欢的任何东西,然后通过“压缩机”运行它。这里没有值得战斗的圣战。 综上所述,如果您要手写所有的生产CSS,尽管评论中有些抱怨,但我

  • 我今天有一个讨论,我的一些同事说他们像这样注入他们的 Angular 服务: 他们说他们这样做是因为它阻止了我的组件的消费者更改注入的服务,有点像: 因此,虽然从技术上讲他们是对的,但我仍然不相信我应该这样做。我问自己以下问题: > DI是Angular的基础部分,如果有人真的这么做了,这个人是应该更好地跑进这个坑里失败还是应该他/她根本做不到这一点 在这种情况下, 对于出于几个原因开始学习 An

  • 问题内容: 我应该负责关闭(或或什至),还是应该将其留给容器? 问题答案: 您确实不需要这样做。 经验法则:如果您没有使用自己创建/打开它,则不需要自己关闭它。例如,如果它是一个,那么您显然需要自己关闭它。 有些人仍然这样做的原因仅仅是为了确保不再将任何内容写入响应主体。如果发生这种情况,则将日志中导致,但这不会影响客户端,因此客户端仍会获得正确的响应。这也是一种更容易的调试,可以发现请求-响应链

  • Android开发人员教程建议我使用片段的主机活动来传递数据等等,那么为什么会有一个设置/获取目标片段的方法呢? 到目前为止,我的应用程序包含一个宿主活动和一个片段,其中有一个按钮可以启动一个对话片段,其中有一个按钮可以启动另一个对话片段。使用让整个磨难有些混乱,所以我正在考虑重新实现,让我的主要活动通过我的主要片段的自定义界面处理方法。 这是正确的思维方式吗?还是使用没有害处?任何人都可以提供使