当前位置: 首页 > 面试题库 >

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

戚云
2023-03-14
问题内容

假设我在一个类中有一个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方法返回一个只读列表。



 类似资料:
  • 我见过很多次scala代码使用Option(对于简单值)或[List[Error],T]来处理错误。 这为这样的代码提供了位置 这会产生一个不太好的代码嵌套,迫使您处理每一步的失败,并迫使您让所有函数返回一个[...] 所以我想知道 > 在scala(或一般的函数式编程)中不鼓励使用异常 使用它们有任何缺点(关于不可变性或代码并发性) 异常与原理或函数式编程有些冲突 你可以想出一个更好的方法来编写

  • 问题内容: 如果使用Sun的专有Java类,则编译器将显示警告。我认为使用这些类通常不是一个好主意。我在某处阅读过。但是,除了警告之外,还有其他根本原因不建议您使用它们? 问题答案: 因为它们是内部API,所以它们可能会以未记录或不受支持的方式进行更改,并且已绑定到特定的JRE / JDK(在您的情况下为Sun),从而限制了程序的可移植性。 尽量避免使用此类API,请始终偏爱公开记录和指定的类。

  • 我有一个枚举: 在枚举成员之间使用方法检查“层次结构”有什么问题吗?我的意思是-当有人将来可能会意外更改顺序时,使用它排除冗长是否有任何缺点。 还是这样做更好:

  • 这在本质上不像那样工作吗?使用它甚至是好的实践吗?这让我很不安。

  • 我有一个IntentService,它使用TimerTask每隔45秒在OnHandleContent中调用webservice。 我的问题是:我正在调用应用程序启动IntentService,而在OnHandleIntent中,由于TimerTask,任务不断重复。。这样做是一种好做法还是有任何缺点?我应该在我的活动中使用报警管理器每次调用intent service,还是继续使用timer任务

  • 我必须编写一些代码,将Java8流的内容多次添加到列表中,我很难找到最好的方法。根据我在SO上读到的内容(主要是这个问题:如何将Java8流的元素添加到现有列表中)和其他地方,我将其缩小到以下选项: PS:在我的示例代码中,我使用作为需要在流上执行的任何操作的占位符