Java - 具有相同引用的对象池

时间:2016-07-04 19:19:39

标签: java reference equals pool

作为一项简单的个人练习,我想做以下事情:

  • 创建一个表示单个整数值的类
  • 任何时刻都不应存在具有相同整数值的此类的两个对象

这是我解决问题的方法:

public class MyClass {

   // Static pool
   private static HashSet<MyClass> pool;

   // Integer value each object holds
   private int value;

   static {
     pool = new HashSet<MyClass>();
   }

   // private Constructor
   private MyClass(int value) {
     this.value = value;
   }

   // Static public method to create MyClass objects
   public MyClass create(int value) {
      // Create tmp object with private constructor
      MyClass tmp = new MyClass(value);

      // At this point I want to check, whether an object with the
      // same integer value exists in the HashSet.
      // If this is the case I would like to return a reference to
      // the object in the HashSet (the GC will remove tmp).
      // Otherwise I would like to add tmp to the HashSet and return
      // a reference to tmp.
   }

}

部分问题是在上面发布的代码中作为评论的一部分编写的。我对以下事情感到好奇。如果我没有覆盖equals(Object obj)pool.contains(tmp)将始终返回false(因为默认equals(Object obj)继承自Object测试以供参考。我可以覆盖{{1}比较对象的equals(Object obj) - 字段,但是如何从HashSet中获取引用以返回它?

我是否需要对value执行任何操作?

2 个答案:

答案 0 :(得分:3)

假设您使用的是Java 8,请使用Map<Integer, MyClass>

private static Map<Integer, MyClass> map = new HashMap<>();

然后,在你的方法中:

public MyClass create(int value) {
  synchronized (map) {
    return map.computeIfAbsent(value, MyClass::new);
  }
}

答案 1 :(得分:2)

只需使用Map<Integer, MyClass>