gpt4 book ai didi

java - 实例化列表 VS 代理列表 VS 检查空引用?

转载 作者:行者123 更新时间:2023-11-29 06:01:19 25 4
gpt4 key购买 nike

我用 java 编写代码,但我认为这个问题不仅仅与一种语言有关。

我的问题发生在我们与一位同事讨论对象列表时,它是类的一个字段。我是说我总是用空列表初始化列表。所以我可以直接使用这个列表的 getter 而无需像这样检查它是否为空:

myObject.getList().add(o)

他告诉我他不想为列表创建 getter,因为他不想检查列表是否为空,因此他创建了一个“addItemToMyList”方法来向列表中添加一个项目。这样,他可以在该方法内部控制列表不为空(如果是这种情况则创建它)并且毫无疑问以这种方式使用列表。

我认为为我们使用的每个列表编写很多方法(获取大小、添加、删除...)可能会是很多工作。

总结:


案例 1:始终初始化字段

类:

class MyObject {
private List<X> list = new ArrayList<X>();

public List<X> getList() { return list; }
}

用法:

MyObject myObj = new MyObject();
myObj.getList().add(anObject);

VS 案例 2:代理列表

类:

class MyObject {
private List<X> list;

public void addItemToList(X item) {
if (list == null) list = new ArrayList<X>();
list.add(item);
}

... // methods to get the size, remove item...

}

用法:

MyObject obj = new MyObject();
obj.addItemToList(anObject);

VS 案例 3:检查空引用

类:

class MyObject {
private List<X> list;

public List<X> getList() { return list; }
public List<X> setList(List<X> list) { this.list = list; }
}

用法:

MyObject myObj = new MyObject();
if (myObj.getList() == null) myObj.setList(new ArrayList<X>());
myObj.getList().add(anObject);

对于您来说,使用列表和复杂字段的好方法是什么?

最佳答案

我想这是主观的,但是:

  • 出于您提到的原因,我会避免情况 3。
  • 我可能会混合使用 1 和 2,没有延迟初始化,这会使您的生活变得更加复杂,并且在性能方面几乎没有增加(如果有的话),并最终确定列表。

-

class MyObject {
private final List<X> list = new ArrayList<>();

public void addItemToList(X item) {
list.add(item);
}

... // methods to get the size, remove item...

}

现在假设在稍后阶段您希望使该类成为线程安全的并添加一个需要 2 个操作成为原子的方法,添加相关代码很容易而无需更改任何其他内容:

class MyObject {
private final List<X> list = new ArrayList<>();
private final Object listLock = new Object();

public void addItemToList(X item) {
synchronized(listLock) {
list.add(item);
}
}

public void addItemToListIfEmpty(X item) { //let's say you need that method
synchronized(listLock) { //you can make the operation atomic
if (list.isEmpty()) {
list.add(item);
}
}
}
... // methods to get the size, remove item...

}

而在解决方案 1 中,您需要更改使用该列表的所有代码。

如果调用代码确实需要整个列表,您始终可以返回一个副本,以便他们可以使用它。

关于java - 实例化列表 VS 代理列表 VS 检查空引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com