使用Java中的getter方法将元素添加到List是一种不好的做法吗?


问题内容

假设我在一个类中有一个private ArrayList或一个LinkedList内部,我将永远不会为其分配新的引用,换句话说,这将永远不会发生:

myLinkedList = anotherLinkedList;

这样我就不需要使用setMyLinkedList(anotherLinkedList)

但!我需要向其中添加元素,或从中删除元素。

  • 我应该写一种新的setter只,做的任务adding,而不是settingmyLinkedList.add(someElement)

  • 还是可以通过使用来做到这一点getter,而不违反Encapsulation主体?

getMyLinkedList().add(someElement)

(+假设如果我不遵守封装规范,我将失去商标:-“)


问题答案:

我认为做这样的事情不是一个特别好的做法:

myObj.getMyList().add(x);

因为您是以非只读方式公开私有类变量的,所以我确实经常看到它(我正在看着您,自动生成的类)。我会争辩说,不是这样做,而是返回一个不可修改的列表,并允许该类的用户通过显式方法添加到列表中:

public class MyClass{
    private final List<String> myList = new ArrayList<String>();

    public List<String> getList(){
        return Collections.unmodifiableList(this.myList);
    }

    public void addToList(final String s){
        this.myList.add(s);
    }
}

编辑 在查看您的评论后,我想补充一点关于您的设置手的想法:

我的意思是在类本身内部的一种新型setter中使用该行代码,例如public void
setter(someElement){this.myLinkedList.add(someElement);}

如果我正确理解您的意思,是说您要公开仅添加到列表中的方法。总体而言,这是我认为您应该为之奋斗的目标,而且很多人都在回答中概述了这些内容,但是,由于您没有重新分配(设置)任何东西,因此将其标记为二传手会产生误导。那,我强烈建议您尽可能从getter方法返回一个只读列表。