作为一项简单的个人练习,我想做以下事情:
这是我解决问题的方法:
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
执行任何操作?
答案 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>
。