![](/img/trans.png)
[英]IntelliJ: search and replace 'var' declarations with actual types
[英]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
是您的正确抽象,而不是List
或Set
,那么请使用它。 如果您需要使用某些东西作为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.