Java良好实践 - 接口类型的声明,而不是实现类型的声明

时间:2012-05-18 16:03:58

标签: java types encapsulation

在“O'Reilly - Programming Android”中,他们建议避免使用此代码:

ArrayList<String> a = new ArrayList<String>();

但要用它替换它:

List<String> a = new ArrayList<String>();

他们认为,如果以后应该更改a的类型来表示链接列表,则维护代码会更容易。如果是这样,为什么不将其设为Collection,甚至是Object

我觉得必须更改实例化以更改其类型,当然最好尽可能地限制它的类型,并在需要时更改额外的行。

它们是否正确?

4 个答案:

答案 0 :(得分:3)

他们是对的。

您应该尽可能使用最受限制的类型。如果Collection是适合您的抽象,而不是ListSet,那么请使用它。如果您需要将某些内容用作Object,那么请务必将其称为Object。但如果你需要更具体,那就更具体一点。诀窍是在没有必要时避免施法。

正如您所提到的,当您不希望它们被公开时,我们的想法是隐藏实现细节。这使您的软件更易于使用且更易于维护。例如,如果您有一个返回List的方法,那么使用您的软件的人不必担心它实际上是List的实现。这有助于使您的软件更易于理解。现在,正因为如此,你可以自由地改变你返回的List类型(大部分)会伤害调用该方法的程序。

答案 1 :(得分:1)

他们错了。

如果某个类型出现在公共API中,它应该与语义允许的一样通用。

List<String> getStringList();

作为一个实现细节,类型应该与程序员知道的一样具体。

ArrayList<String> stringList = new ArrayList<>();

答案 2 :(得分:0)

因为您无法对Object引用执行任何有用的操作。

答案 3 :(得分:0)

在我个人看来,您应该尽可能使用界面(在层次结构中),并进行所需的操作。

在某些情况下,您只需要存储对象,迭代并使用索引获取它们。 List接口提供了这个。对象不提供这些方法。

使用Object - 您将使代码的可读性降低,并且可能会出现强制转换异常。

相关问题