这是在创建接口/ API的上下文中。
最佳做法建议在界面中使用常规类型而不是特定类型 - 例如Map
而不是HashMap
。
最佳做法还建议使用不可变类型而不是可变类型。
因此,考虑到这两个建议(并且不考虑性能/内存占用,第三方库/依赖关系和便利/功能),公共接口中的方法应该如下所示
public List<SomeClass> someMethod(...)
或者更确切地说是
public ImmutableList<SomeClass> someMethod(...)
答案 0 :(得分:5)
当番石榴人们讨论过这个问题时,我们已经说过:
API交换的类型的基本建议是:选择仍然传达相关语义信息的最常规类型。
我认为ImmutableCollection所做的三个语义保证几乎在任何情况下都与返回值极为相关(这三个是不变性,缺少空元素和保证迭代顺序)。所以我几乎总是会返回ImmutableSet,而不是Set。
我们真的希望人们将ImmutableSet等视为每个重要意义上的接口。它们没有两个原因:不可变性保证的可靠性,以及Java在JDK 8之前不允许在接口上使用静态方法的事实,并且为了方便我们希望它们在那里。
大多数人认为ImmutableList是出于这个原因的实现,但实际上有几种到几种不同的实现。你只是看不到它们。
答案 1 :(得分:1)
如果方法的契约保证List是不可变的,那么返回类型应该是ImmutableList而不是List。这比仅仅提到List在方法的JavaDoc中是不可变的更明确。
但是,如果列表的不变性是实现细节,而不是合同,那么返回类型应该是List。
答案 2 :(得分:1)
编写API是为了与用户签订合同。
最佳实践主要针对需要为第三方编写API并需要定义接口的上下文。
我们可以在不同的背景下有不同的观点。如果您正在编写将由第三方使用的库,则需要考虑它们应该或不应该更改对象状态。
如果API将在内部使用(使用相同的代码库)&amp;目的是实现松散耦合,然后你需要考虑易于编写,可扩展性和可维护性。
当您对对象的状态做出大量假设时,不可变API将避免数据不一致。另一方面,可变对象可以节省开发工作。