У меня есть фабрика, которая создает объекты класса MyClass, возвращая уже сгенерированные, когда они существуют. Поскольку у меня есть метод создания (getOrCreateMyClass), принимающий несколько параметров, как лучше всего использовать карту для хранения и извлечения объектов?
Мое текущее решение заключается в следующем, но мне это не кажется слишком ясным. Я использую метод hashCode (слегка модифицированный) класса MyClass для построения int на основе параметров класса MyClass и использую его в качестве ключа карты.
import java.util.HashMap;
import java.util.Map;
public class MyClassFactory {
static Map<Integer, MyClass> cache = new HashMap<Integer, MyClass>();
private static class MyClass {
private String s;
private int i;
public MyClass(String s, int i) {
}
public static int getHashCode(String s, int i) {
final int prime = 31;
int result = 1;
result = prime * result + i;
result = prime * result + ((s == null) ? 0 : s.hashCode());
return result;
}
@Override
public int hashCode() {
return getHashCode(this.s, this.i);
}
}
public static MyClass getOrCreateMyClass(String s, int i) {
int hashCode = MyClass.getHashCode(s, i);
MyClass a = cache.get(hashCode);
if (a == null) {
a = new MyClass(s, i);
cache.put(hashCode , a);
}
return a;
}
}
getOrCreateMyClass
будет методом, с помощью которого все клиенты будут получать экземплярыMyClass
, я бы рекомендовал дать ему более простое имя, например простоget
... возможно, ему не нужно так много информации о том, как он работает в своем имени. Вы, вероятно, захотите, чтобы в его Javadoc упоминалось, что он всегда возвращает один и тот же экземпляр для данной пары входных данных, конечно. - person ColinD   schedule 15.11.2010