在用 Java 编程时,我几乎总是出于习惯,写这样的东西:
public List<String> foo() {
return new ArrayList<String>();
}
大多数时候甚至没有考虑它。现在,问题是:我是否应该始终将接口指定为返回类型?还是建议使用接口的实际实现,如果可以,在什么情况下?
很明显,使用接口有很多优点(这就是它存在的原因)。在大多数情况下,库函数使用什么具体实现并不重要。但也许在某些情况下它确实很重要。例如,如果我知道我将主要随机访问列表中的数据,aLinkedList
会很糟糕。但是如果我的库函数只返回接口,我根本不知道。为了安全起见,我什至可能需要将列表显式复制到ArrayList
:
List bar = foo();
List myList = bar instanceof LinkedList ? new ArrayList(bar) : bar;
但这看起来很可怕,我的同事可能会在自助餐厅私刑处死我。理所当然地。
你们有什么感想?你的指导方针是什么,你什么时候倾向于抽象解决方案,你什么时候透露你的实现细节以获得潜在的性能提升?