创建支持实习的对象的良好模式?

我需要一个支持实习的类,比如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,其中键是对象,值是参数?

我想到了两件事

  1. Flyweight模式

  2. 番石榴的计算地图

如果您可以添加第三方依赖项,请考虑Google Guava及其Interners类。 它有两个简单的内部工具: WeakInternerStrongInternerStrongInternerConcurrentMap支持,最适合于一组小的,封闭的值。 如果您无法控制或以任何方式限制实际内容,那么您可以选择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");