Si consideri il seguente enums
, che è meglio? Entrambi possono essere utilizzati esattamente allo stesso modo, ma quali sono i vantaggi l'uno rispetto all'altro?Sovrascrivere il metodo astratto o utilizzare un singolo metodo in enumerazione?
1. Esclusione metodo astratto:
public enum Direction {
UP {
@Override
public Direction getOppposite() {
return DOWN;
}
@Override
public Direction getRotateClockwise() {
return RIGHT;
}
@Override
public Direction getRotateAnticlockwise() {
return LEFT;
}
},
/* DOWN, LEFT and RIGHT skipped */
;
public abstract Direction getOppposite();
public abstract Direction getRotateClockwise();
public abstract Direction getRotateAnticlockwise();
}
2. Utilizzando un unico metodo:
public enum Orientation {
UP, DOWN, LEFT, RIGHT;
public Orientation getOppposite() {
switch (this) {
case UP:
return DOWN;
case DOWN:
return UP;
case LEFT:
return RIGHT;
case RIGHT:
return LEFT;
default:
return null;
}
}
/* getRotateClockwise and getRotateAnticlockwise skipped */
}
Edit: Spero davvero di vedere alcuni ben motivata/risposte elaborate, con evidenze/fonti a rivendicazioni particolari. La maggior parte delle risposte esistenti riguardo alle prestazioni non è davvero convincente a causa della mancanza di prove.
È possibile può suggerire alternative, ma deve essere chiaro come è meglio di quelli dichiarati e/o come quelli dichiarati è peggio e fornire le prove quando necessario.
Una terza opzione potrebbe essere quella di includere argomenti come 'opposite',' 'cwise' e ccwise' al costruttore di' Direction', assegnarli alle variabili di istanza finali e con quelli (sia attraverso diretta accesso o getter definiti sulla 'classe'). – akaIDIOT
Non mi piace neanche, perché non mi piace cercare la logica all'interno delle enumerazioni. Tuttavia il secondo è più conciso e non implica l'annullamento di un metodo astratto da parte di un membro enum, che è un po 'doloroso per i miei occhi :) – gd1
@ gd1 Se nessuna logica dentro enum, come implementereste qualcosa come il mio esempio? Se hai un'alternativa puoi suggerire una risposta. –