不变性和一般与特定类型

时间:2014-02-26 23:30:57

标签: java interface guava

这是在创建接口/ API的上下文中。

最佳做法建议在界面中使用常规类型而不是特定类型 - 例如Map而不是HashMap

最佳做法还建议使用不可变类型而不是可变类型。

因此,考虑到这两个建议(并且不考虑性能/内存占用,第三方库/依赖关系和便利/功能),公共接口中的方法应该如下所示

public List<SomeClass> someMethod(...)

或者更确切地说是

public ImmutableList<SomeClass> someMethod(...)

3 个答案:

答案 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将避免数据不一致。另一方面,可变对象可以节省开发工作。

相关问题