关于获取和设置以及何时使用超类的问题

时间:2010-05-22 22:54:55

标签: java interface get set super

我有以下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,因为这样我可以强制执行我想要的实现,否则可能会在这里和那里混乱使用不同类型的列表。

但我不确定这是否可行......

3 个答案:

答案 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都足够好。