gpt4 book ai didi

java - 为什么要在内部使用 MyObject[],而公开 List

转载 作者:搜寻专家 更新时间:2023-11-01 01:24:10 25 4
gpt4 key购买 nike

我遇到了一个具有不可变属性的类:

MyObject[] allObjs

属性初始化如下:

List<MyObject> objs = createAllMyObjects();
allObjs = objs.toArray(new MyObject[objs.size()]);

当它通过访问器公开时,它作为一个列表完成:

public List<MyObject> getAllMyObjects() {
return Collections.unmodifiableList(Arrays.asList(allObjs));
}

为什么程序员会这样做?有什么我不知道的好处吗?

性能不是问题,因为 objs 数组永远只包含几十个元素。

我们似乎在兜圈子。

这个类是一种工厂,所以它有一个私有(private)构造函数并且只公开静态方法(不确定这是否是造成这种疯狂的原因)。

编辑

我想我的问题真的是,“为什么不直接使用内部 List<MyObject> allObjs 而不是 MyObject[] allObjs ,并返回 Collections.unmodifiableList(allObjs)?”因为这会完成同样的事情。

最佳答案

我看到的唯一原因是“在误用的情况下尽早失败”(如果这个设计选择不是随机的并且有意义,那么意思就是他很少信任他的特定客户)。

MyObject[] 具体化,并且在运行时检查,而List<MyObject>不是。可以在后者中偷偷引用非 MyObject 引用(他当然会在编译时收到未经检查的警告),这将在未来某个未定义的点失败并返回 ClassCastException。 , 但他不能对 MyObject[] 做同样的事情- 这将在误用时立即失败。

请注意,如果客户端是在泛型化之前使用此 API 的预构建二进制文件,那么没有人会收到未经检查的警告,因此如果此代码试图迁移预泛型客户端使用的代码,这是有道理的。

(实现相同结果的另一种方法是使用 List<T> 并且还需要 Class<T> ,以便后者可以提供运行时类型检查。但这需要例如另一个构造函数参数 - 现有客户端不会自动利用它。**更新:** 这基本上描述了 Sauer 在第一条评论中提到的 API 调用,因此不必重新发明它,只需使用那个 :))。

关于java - 为什么要在内部使用 MyObject[],而公开 List<MyObject>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599703/

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