Spesso ho questo problema ma non l'ho trovato come un modello di programmazione stabilito. Ho alcuni C di classe la cui uguaglianza è determinata da qualche tasto k e voglio impedire l'inizializzazione dispendiosa di tempo di ulteriori oggetti uguali.
Questa è la mia implementazione ma il metodo get sincronizzato impedisce l'istanziazione parallela.
Class C
{
Key key;
private static Map<Key,C> cs = new HashMap<Key,C>();
private C(Key key)
{
// this takes a long time
}
synchronized static C get(Key key)
{
C c = cs.get(key);
if(c==null)
{
c = new C(key);
cs.put(key,c);
}
return c;
}
@Override public boolean equals(Object o)
{
if (this == o) return true;
if (o == null) return false;
if (getClass() != o.getClass()) return false;
C other = (C) o;
if (key == null)
{
if (other.key != null) return false;
}
else if (!key.equals(other.key)) return false;
return true;
}
@Override public int hashCode() {..}
}
Puoi indicarmi una best practice esistente a questo, se esiste, o mostrarmi come implementarla in modo ottimale? I miei criteri sono chiarezza, brevità, prestazioni e sicurezza del thread.