为什么要在内部使用MyObject [],但是公开List <MyObject>?

Tim*_*thy 4 java arrays collections

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

MyObject[] allObjs
Run Code Online (Sandbox Code Playgroud)

该属性初始化如下:

List<MyObject> objs = createAllMyObjects();
allObjs = objs.toArray(new MyObject[objs.size()]);
Run Code Online (Sandbox Code Playgroud)

当它通过访问器公开时,它作为List完成:

public List<MyObject> getAllMyObjects() {
    return Collections.unmodifiableList(Arrays.asList(allObjs));
}
Run Code Online (Sandbox Code Playgroud)

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

性能不是问题,因为objs数组只会在几十个元素中出现.

我们似乎正在四处转圈.

这个类是一种工厂,因此它有一个私有构造函数并且只暴露静态方法(不确定这是否是疯狂的原因).

编辑

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

Dim*_*eou 6

我看到的唯一原因是"在滥用的情况下提早失败"(如果这种设计选择不是随机的并且具有意义,那么他的信任很少就是他的特定客户).

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

请注意,如果客户端是在生成之前使用此API的预构建二进制文件,那么没有人获得未经检查的警告,因此如果此代码尝试迁移前泛型客户端使用的代码,则这是有意义的.

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

  • 那是个很好的观点!但是,您可以提供`checkedList`以获得通用化列表的快速失败行为:http://java.sun.com/javase/6/docs/api/java/util/Collections.html#checkedList(java.util) .LIST,%20java.lang.Class%29 (2认同)