- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我遇到了一个具有不可变属性的类:
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/
我对 PHP 中的对象克隆有疑问。我知道克隆创建了一个“深拷贝”,因为创建了一个新对象,其变量初始化为克隆它的对象中相应变量的值。然而,as discussed here ,这意味着任何引用变量都将引
我有一个有点难以解释的合法 JS 问题。请原谅我莫名其妙的说话方式,努力把握大意。 :P 在 JS 中对象可以有属性。您可以将功能分配给属性。您可以重新定义对象的属性而不改变其其他属性。 var my
我有这种情况,我在 C# 中使用的 web 服务方法返回一个业务对象,当使用以下代码调用 web 服务方法时,我在引用中得到异常“无法将类型为 ContactInfo 的对象转换为类型 Contact
我试图进入在 ScalaDays 2013 上展示的新 Scala Pickling 库:Scala Pickling 我真正缺少的是一些如何使用库的简单示例。 我明白我可以像这样腌制一些物体并再次解
这个问题已经有答案了: Which is more effective: if (null == variable) or if (variable == null)? [duplicate] (9
这行代码做了什么? MyObject *objectOne = (MyObject *)recognizer.view; 我对 (MyObject *) 感到困惑。 它是否有效地将 recognize
我遇到了一个具有不可变属性的类: MyObject[] allObjs 属性初始化如下: List objs = createAllMyObjects(); allObjs = objs.toArra
这是我的代码: Set> mySet = getSetOf(MyObject.class); public Set getSetOf(Class setClass) { Set set =
我在面试时被问到这个问题。不能使用 Google Guava 或 MultiMap。我有课 public class Alpha { String company; int loc
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Sorting a collection of objects Sorting an ArrayList of Co
我想根据对象属性对 ArrayList 中的一些对象进行排序。该对象具有: public class Minterm { String minTerm; char flagTick;
这个比那个好吗? 这甚至是一个有效的问题吗? 我最近被告知 MyObject.DoSomething()已经过时了,服务方式是首选。那正确吗? 例子: public class Policy : IC
这个问题在这里已经有了答案: Why can't assign I to ? (2 个答案) What are the risks of explicitly casting from a lis
MyObject obj = new MyObject(); 我知道“new”关键字将调用构造函数并初始化托管堆中的对象。 我的问题是 CLR 如何执行以下操作。 CLR 如何执行上述行? CLR 如
如何转换 Flux直接到Mono> ? 我正在寻找相当于 Single> single = observable.toList()来自 RxJava。 使用阻塞运算符,我可以这样做: val just
在我的 Scalding Flow 中,我有一个 TypedType[Set[MyObject]]。如何将其展平为 TypedType[MyObject]? 最佳答案 pipe.flatMap(ide
我有很多 resharper 警告将我的参数从常规数组更改为相同类型的 IEnumerable,所以它会改变这个: public Interface IGenerator { voi
存储 Collection 的最佳方式是什么? ?该集合对于当前用户来说实际上是静态的。每个用户只能看到他们的 Collection 。 MyItem项目工具 IItem : public inter
我目前正在练习/学习 Ruby 中的单例方法和单例类,我遇到了一个疑问。鉴于: myobject = Object.new 这样做有什么区别吗: def myobject.mymethod end 然
类似于this question但使用对象而不是指针。 如果我有如下代码 Foo f; vector vect; vect.push_back(f); vect.erase(vect.begin())
我是一名优秀的程序员,十分优秀!