3

我有以下获取方法:

public List<PersonalMessage> getMessagesList() {
    List<PersonalMessage> newList = new ArrayList<PersonalMessage>();

    for(PersonalMessage pMessage : this.listMessages) {
        newList.add(pMessage.clone());
    }

    return newList;
}

您可以看到,如果我需要将实现更改ArrayList为其他内容,我可以轻松地做到这一点,我只需要更改初始化newList以及所有其他取决于getMessageList()返回内容的代码仍然可以工作。

然后我有这个设置方法:

public void setMessagesList(ArrayList<PersonalMessage> listMessages) {
    this.listMessages = listMessages;
}

我的问题是,我应该List在方法签名中使用而不是 `ArrayList 吗?

我决定使用ArrayList这种方式是因为我可以强制执行我想要的实现,否则这里和那里可能会出现不同类型的列表混乱。

但我不确定这是否是要走的路...

4

3 回答 3

6

setter 方法打破了底层表示的抽象。您的公共界面真的需要它吗?

public void setMessagesList(Collection<PersonalMessage> messages) {
    this.listMessages = new ArrayList<PersonalMessage>(messages);
}
于 2010-05-22T23:03:58.780 回答
2

一般来说,我会选择接口(列表)。这意味着如果您决定在这种情况下使用 ArrayList 不是正确的东西,您就不会破坏客户端代码。

如果你使用 List,你也同意你自己。getter 和 setter 具有相同的类型。

另一个潜在的问题是,如果某些反射实用程序的类型不同,它们可能无法识别您的 getter/setter 对。

于 2010-05-22T23:03:24.757 回答
0

您是否依赖 PersonalMessages 的顺序,还是 Collection 也足够了?为什么要强制执行特定的实现?对于上面的代码,Paramater 类型的 Collection,甚至 Iterable 就足够了。

于 2010-05-22T23:03:33.913 回答