繁体   English   中英

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

[英]Java good practice - Declarations of interface types instead of declarations of implementation types

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

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

但要用这个替换它:

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

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

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

他们是对的吗?

他们是对的。

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

正如您所提到的,我们的想法是在您不希望公开它们时隐藏实现细节。 这使您的软件更易于使用且更易于维护。 例如,如果您有一个返回List的方法,那么使用您的软件的人不必担心它实际上是List实现。 这有助于使您的软件更易于理解。 现在,正因为如此,您可以随意更改哪种类型的List (大多数情况下)会损坏调用该方法的程序。

他们错了。

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

List<String> getStringList();

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

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

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

在我个人看来,您应该使用尽可能高的接口(在层次结构中)并具有您需要的操作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM