我需要一个支持实习的类,比如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,其中键是对象,值是参数?
答案 0 :(得分:2)
我想到了两件事
答案 1 :(得分:1)
如果您可以添加第三方依赖项,请考虑Google Guava及其Interners类。它有两个简单的插播器:WeakInterner
和StrongInterner
。 StrongInterner
由ConcurrentMap
支持,最适合一小组封闭的值。如果您无法控制或以任何方式限制被拘禁的内容,那么您可以选择WeakInterner
,这取决于WeakReference
。使用WeakInterner
的权衡是性能。
答案 2 :(得分:0)
您无法使用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");