Ad esempio, se uso un enum, che tutti i valori sono definiti manualmente individualmente, ad esempio:
public enum MyNum{
Zero(0),
One(1),
Two(2);
private final int value;
MyNum(int value){
this.value=value;
}
public int getValue(){
return value;
}
}
public class Test{
public static MyNum getUnknownMyNum(){
return MyNum.Two;
}
public static void main(String[] args){
MyNum n1=MyNum.One;
MyNum n2=MyNum.Two;
System.out.println(n1==getUnknownMyNum());
System.out.println(n2==getUnknownMyNum());
}
}
e non utilizzare la funzione di operazione bit a bit, ad esempio:
MyNum n=MyNum.Zero | MyNum.One;
, viola i principi di open-closed? Perché penso che in questo caso, aggiungendo un nuovo enum (ad esempio: Tre (3)) è necessario modificare MyNum.java.
Se tutti i valori enum vengono assegnati manualmente e non ho bisogno di operazioni bit a bit quando si utilizza quell'enumerazione, significa che ciascun valore è indipendente l'uno dall'altro, che è diverso da
public enum MyNum{
Zero,
One,
Two
}
che calcola ogni valore da zero, e quindi possiamo sostituire il seguente enum:
public enum MyNum{
Zero(0),
One(1),
Two(2);
private final int value;
MyNum(int value){
this.value=value;
}
public int getValue(){
return value;
}
}
in singole classi:
public interface MyNum{
}
public class Zero implements MyNum{
public static final Zero MyNum=new Zero();
public static final int value=0;
}
public class One implements MyNum{
public static final One MyNum=new One();
public static final int value=1;
}
public class Two implements MyNum{
public static final Two MyNum=new Two();
public static final int value=2;
}
public class Test{
public static MyNum getUnknownMyNum(){
return Two.MyNum;
}
public static void main(String[] args){
MyNum n1=One.MyNum;
MyNum n2=Two.MyNum;
System.out.println(n1==getUnknownMyNum());
System.out.println(n2==getUnknownMyNum());
}
}
che sostituisce quello che utilizza l'enumerazione nella versione che utilizza un'interfaccia con le classi. E questa volta non abbiamo bisogno di modificare MyNum.java per aggiungere un nuovo enum "Tre", ma creare una nuova classe Three.java:
public class Three implements MyNum{
public static final Three MyNum=new Three();
public static final int value=3;
}
che si adatta a principio aperto chiuso, è vero?
Nota: per enumerazioni c ++ per esempio,
enum class MyNum{
Zero,
One,
Two
}
enum class MyNum{
Zero,
One=2,
Two
}
non considerano "tutti i valori sono definiti manualmente singolarmente" perché alcuni valori devono calcolare dal valore precedente