我有以下get方法:
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
,因为这样我可以强制执行我想要的实现,否则可能会在这里和那里混乱使用不同类型的列表。
但我不确定这是否可行......
答案 0 :(得分:7)
setter方法打破了底层表示的抽象。你的公共界面真的需要吗?
public void setMessagesList(Collection<PersonalMessage> messages) {
this.listMessages = new ArrayList<PersonalMessage>(messages);
}
答案 1 :(得分:2)
一般来说,我会选择接口(List)。这意味着如果您认为在这种情况下使用ArrayList不正确,那么您不会破坏客户端代码。
如果您使用List,您也同意自己的意见。 getter和setter具有相同的类型。
另一个潜在的问题是,如果某些反射工具不具有相同的类型,则可能无法识别您的getter / setter对。
答案 2 :(得分:0)
您是否依赖于PersonalMessages的顺序,或者收藏是否足够?为什么要强制执行特定的实现?对于上面的代码,Paramater类型的Collection,甚至Iterable都足够好。