Java 接口设计:采用单一输入并返回多个输出的方法
我想收集哪些是首选的反馈,是好是坏Java 接口设计:采用单一输入并返回多个输出的方法,java,Java,我想收集哪些是首选的反馈,是好是坏 Function<I, O> { List<O> take( I ); } 函数{ 名单(I); } 或 接收机{ 无效取数(T); } 处理机{ 无效处理器(I,接收器>); } 我知道简单的答案是函数,但处理器确实有一些好处 能够通过一个接收器过滤添加的内容 没有明确的首选方案。这取决于用例 正如您所指出的,使用前者的主要原因是简单。客户端不必实现任何东西就可以使用您的接口。对于服务API来说,函数并不总是最佳选择,因为
Function<I, O> {
List<O> take( I );
}
函数{
名单(I);
}
或
接收机{
无效取数(T);
}
处理机{
无效处理器(I,接收器>);
}
我知道简单的答案是函数,但处理器确实有一些好处
- 能够通过一个接收器过滤添加的内容
- 没有明确的首选方案。这取决于用例
正如您所指出的,使用前者的主要原因是简单。客户端不必实现任何东西就可以使用您的接口。对于服务API来说,函数并不总是最佳选择,因为您可能事先不知道要返回多少操作系统
采用后者的主要原因是可伸缩性。例如,您可能正在生成数以百万计的O对象,在返回任何对象之前尝试将它们全部填充到内存中是自杀。然而,像处理器这样的回调模式很难嵌入到服务API中
最佳服务API是一种混合API:
Function<I, O> {
List<O> take( I, OToken );
}
函数{
列表(I,OToken);
}
其中返回一个O的“页面”,从表示返回的最后一个页面结尾的OToken开始。顺便说一句,如果您愿意返回
迭代器而不是列表来实现分页和可伸缩性,那么您可以在客户端的上面添加另一层,它可以抽象出OToken内容。您可以轻松地实现逻辑,只取接收器中的前n。无需将其烘焙到处理器中。这些类型的用例是我脑海中可以实现的额外功能。您对迭代器的评论当然是好处的一部分。@mP.,如果分页逻辑在接收器中,那么处理器将需要获取(O)
的一些反馈,以避免在n+1到百万次输出上浪费周期。它变成了两者之间的对话,如果您的起点超过了索引0,或者如果这是您正在描述的服务API,则会变得更加复杂。我相信您也可以将处理器作为客户端的一个层来处理。@判断为true要处理停止操作,需要返回一个控件,该控件有两个选项:继续和停止。
Function<I, O> {
List<O> take( I, OToken );
}