在java中使用getter方法向List添加元素是不好的做法?

Mil*_*d R 16 java encapsulation getter-setter

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

myLinkedList = anotherLinkedList;
Run Code Online (Sandbox Code Playgroud)

所以我不需要使用setMyLinkedList(anotherLinkedList).

但!我需要添加元素,或从中删除元素.

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

  • 或者可以通过使用getter而不违反Encapsulation委托人来做到这一点?

    getMyLinkedList().add(someElement)

(+假设如果我不服从封装,我将失去我的标记: - ")

Nic*_*zio 16

我不认为做一些特别好的做法:

myObj.getMyList().add(x);
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑在审核了您的评论之后,我想补充一点关于您的setter想法:

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

如果我正确理解你,你说你想要公开一个只添加到你的列表中的方法.总的来说,这就是我认为你应该拍摄的内容,以及许多人在答案中概述的内容,然而,将其标记为制定者有点误导,因为你没有重新分配(设置)任何东西.那,我强烈建议如果可能的话,从你的getter方法中返回一个只读列表.


Int*_*uff 8

通常,您不应该假设getter返回的列表是原始列表.例如,它可以被装饰或代理.如果要防止在目标对象上设置新列表,则可以在目标类上定义add方法.


ele*_*t11 8

我建议在这种情况下,最好遵循您的Encapsulation主体并使用一种方法将元素添加到列表中.您可以限制对列表的访问,private以便其他类无法直接访问数据类型.

让存储您的类ArrayList可以直接访问列表,但是当其他类要添加到列表中时,请使用add()方法.