创建支持实习的对象的良好模式?
我需要一个支持实习的类,比如Java的String
类。 在创建Class的实例时,如果已存在具有相同参数的引用,则应返回预先存在的引用。 否则它应该返回一个新的引用。 这样:
Foo a = new Foo(5); Foo b = new Foo(5); Foo c = new Foo(6); a == b a != c
1)维护预先存在的对象表是工厂的工作,还是表通常只是类本身内的静态变量?
2)预先存在的物体表是什么? 它是每次请求实例时搜索的一组对象,还是一个Map,其中键是对象,值是参数?
我想到了两件事
-
Flyweight模式
-
番石榴的计算地图
如果您可以添加第三方依赖项,请考虑Google Guava及其Interners类。 它有两个简单的内部工具: WeakInterner
和StrongInterner
。 StrongInterner
由ConcurrentMap
支持,最适合于一组小的,封闭的值。 如果您无法控制或以任何方式限制实际内容,那么您可以选择WeakInterner
,它依赖于WeakReference
。 使用WeakInterner
是性能。
您不能使用new
运算符执行此操作,该运算符不会重用现有对象。 工厂是最好的方法。 (它可以像类的静态newInstance
方法一样简单。)通常的数据结构是某种类型的Map(通常是HashMap)。 套装会贵得多。 根据对象的数量,您可以只使用数组。 (我想这可能是Byte所做的。)
请注意,不会自动插入String对象,并且在调用intern
,它可能会返回不同的String实例。 例如,此代码将打印“false”:
String a = new String("hello"); String b = new String("hello"); a.intern(); b.intern(); System.out.println(a == b ? "true" : "false");