Dans cet article, j'exprimerai le code qui se comporte de la même manière que le type Enum (énumération) sans utiliser le type Enum. Le type Enum de Java est un type qui conserve plusieurs constantes ensemble. Un ensemble de constantes fixes telles que le groupe sanguin, le sexe, le nom du mois, la constellation et divers codes peuvent être codés sur la base d'un concept orienté objet. De plus, vous pouvez utiliser des fonctions utiles par défaut. Cette fois, j'expliquerai en utilisant la marque Trump (piques, cœurs, diamants, clubs) comme exemple.
Suit.java
public enum Suit {
SPADE("♠"), HEART("♡"), DIAMOND("♢"), CLUB("♣");
private String symbol;
private Suit(String symbol){
this.symbol = symbol;
}
public String getSymbol(){
return symbol;
}
}
Suit.java
public class Suit implements Comparable<Suit>{
public static final Suit SPADE = new Suit("SPADE", "♠");
public static final Suit HEART = new Suit("HEART", "♡");
public static final Suit DIAMOND = new Suit("DIAMOND", "♢");
public static final Suit CLUB = new Suit("CLUB", "♣");
private static final List<Suit> VALUES =
Collections.unmodifiableList(
Arrays.asList(SPADE, HEART, DIAMOND, CLUB)
);
private final String name;
private final String symbol;
private Suit(String name, String symbol){
this.name = name;
this.symbol = symbol;
}
public String getSymbol(){
return symbol;
}
@Override
public int compareTo(Suit t){
return Integer.valueOf(this.ordinal()).compareTo(t.ordinal());
}
public Class<? extends Suit> getDeclaringClass(){
return this.getClass();
}
public String name(){
return name;
}
public int ordinal(){
return VALUES.indexOf(this);
}
@Override
public String toString(){
return name();
}
public static Suit valueOf(String name){
for(Suit value : VALUES){
if(value.name.equals(name)) return value;
}
throw new IllegalArgumentException();
}
public static List<Suit> values() {
return VALUES;
}
}
La partie Liste est écrite comme ceci.
private static final List<Suit> VALUES =
Collections.unmodifiableList(
Arrays.asList(SPADE, HEART, DIAMOND, CLUB)
);
Dans cette partie, la variable membre VALUES se voit attribuer une liste invariante avec quatre marques (Suit) comme éléments. Je vais expliquer chaque fonction.
Avec et sans le type Enum
private Suit(String symbol)
Lorsqu'il n'est pas utilisé
private Suit(String name, String symbol)
Les arguments du constructeur sont différents. La raison en est qu'il n'y a aucun moyen d'obtenir les noms de variable des variables membres utilisées dans la fonction toString et la fonction valueOf (les valeurs sont SPADE, HEART, DIAMOND, CLUB de chaque chaîne de caractères) à l'aide de la fonction. Par conséquent, il doit être conservé dans la classe via un argument.
[Nouvelle édition Refactoring-Safely Improve Existing Code- (OBJECT TECHNOLOGY SERIES)](Lien fixe: http://amzn.asia/c5WxOUh)
Recommended Posts