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

标签 java arrays collections

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

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/

相关文章:

java - HashMap 的意外输出

java - <? 之间的区别 super T> 和 <?在 Java 中扩展 T>

java - 一个接一个地从 Arraylist 中打印出不同的项目

java - 右侧 GWT 树菜单项中的图标。

java - 通过 Post 将 JSON 从 Java 发送到 PHP

arrays - 识别一组数组中最小数据对应的索引

java - 将 : Map<String, Double> 重构为 Map<String、Double 或 String>

java - Java中嵌套方法调用的成本

java - 如何管理数组中的概率?

java - ListAdapter将数组类型改为int后拒绝申请