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

2022-09-02 19:32:08

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

myLinkedList = anotherLinkedList;

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

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

  • 我应该写一个新的类型,只做任务,而不是,喜欢?setteraddingsettingmyLinkedList.add(someElement)

  • 或者可以使用 ,而不违背原则?getterEncapsulation

    getMyLinkedList().add(someElement)

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


答案 1

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

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方法返回只读列表。


答案 2

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

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


推荐