1

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

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

但用这个替换它:

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

他们认为,如果以后a应该将类型更改为链表,则维护代码会更容易。如果是这样,为什么不把它做成 type Collection,甚至Object

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

他们是正确的吗?

4

4 回答 4

3

他们是正确的。

您应该尽可能使用最受限制的类型。IfCollection对您来说是正确的抽象,而不是Listor Set,然后使用它。如果您需要将某物用作Object,那么请务必将其称为Object。但如果你需要更具体,那就更具体。诀窍是避免在不需要时进行强制转换。

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

于 2012-05-18T16:09:19.890 回答
0

因为你不能对Object参考做任何有用的事情。

于 2012-05-18T16:04:59.213 回答
0

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

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

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

于 2012-05-18T16:07:56.273 回答
0

他们错了。

如果一个类型出现在公共 API 中,它应该在语义允许的范围内具有通用性。

List<String> getStringList();

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

ArrayList<String> stringList = new ArrayList<>();
于 2012-05-18T16:29:20.577 回答