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)?" 因为这会完成同样的事情.
我看到的唯一原因是"在滥用的情况下提早失败"(如果这种设计选择不是随机的并且具有意义,那么他的信任很少就是他的特定客户).
MyObject[]被具体化,并在运行时检查,而List<MyObject>不是.可以在后者中隐藏非MyObject引用(当然,他会在编译时得到未经检查的警告),这将在某个未定义的未来点失败ClassCastException,但是他不能做同样的事情MyObject[]- 这将立即失败滥用.
请注意,如果客户端是在生成之前使用此API的预构建二进制文件,那么没有人获得未经检查的警告,因此如果此代码尝试迁移前泛型客户端使用的代码,则这是有意义的.
(实现相同结果的另一种方法是使用List<T>并且也需要Class<T>,以便后者可以提供运行时类型检查.但这需要例如另一个构造函数参数 - 现有客户端不会自动利用它.**更新:**这基本上描述了Sauer在第一条评论中提到的API调用,所以没有必要重新发明这个,只需使用那个:)).