Ho creato un Enum per definire determinate azioni. Programmazione contro un'API esterna Sono costretto a utilizzare un Integer
per esprimere questa azione. Ecco perché ho aggiunto un campo istanza intero al mio Enum. Questo dovrebbe essere d'accordo con Effective Java di Joshua Bloch, invece di fare affidamento su ordinal()
o sull'ordine delle costanti Enum usando values()[index]
.Creare un metodo factory enum con un valore di istanza univoco
public enum Action {
START(0),
QUIT(1);
public final int code;
Protocol(int code) {
this.code = code;
}
}
ottengo un valore intero what
dalle API e ora voglio per creare un valore Enum fuori di esso, come posso implementare questo nel modo più generica?
Ovviamente, l'aggiunta di un tale metodo di fabbrica, non funzionerà. Non puoi istanziare un Enum.
Action valueOf(int what) {
return new Action(what);
}
Naturalmente, posso sempre fare un'istruzione switch-case e aggiungere tutti i possibili codici e restituire la costante appropriata. Ma voglio evitare di definirli in due posti allo stesso tempo.
È possibile inizializzare la mappa con le dimensioni corrette: 'nuova HashMap <> (Action.values (). Length, 1);' (non farà differenza se non ci sono molti valori ma non costa qualsiasi cosa lo faccia). – assylias
@assylias Divertente, ho esaminato il codice sorgente e il costruttore ignora effettivamente il fattore di carico: * Si noti che questa implementazione ignora loadFactor; usa sempre un fattore di carico di 3/4. Questo semplifica il codice e in generale migliora le prestazioni. * –
Non lo sapevo, interessante. – assylias