[Java] Type Express Enum sans utiliser le type Enum (énumération)

introduction

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.

Lors de l'utilisation du type Enum

Suit.java


public enum Suit {
    SPADE("♠"), HEART("♡"), DIAMOND("♢"), CLUB("♣");

    private String symbol;
    
    private Suit(String symbol){
        this.symbol = symbol;
    }
    
    public String getSymbol(){
        return symbol;
    }
}

Lorsque vous n'utilisez pas le type Enum

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;
    }
}

Commentaire

Variable membre 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.

  1. La fonction Collections.unmodifiableList renvoie une liste invariante. Les listes immuables, contrairement aux listes de variables comme ArrayList, ne peuvent pas modifier leurs valeurs.
  2. La fonction Arrays.asList renvoie une liste avec des arguments comme éléments. Vous pouvez attribuer une valeur initiale à List via cette fonction. Bien qu'elle ne soit pas utilisée cette fois, la taille (nombre d'éléments) de la valeur de retour List ne peut pas être augmentée ou diminuée. Parce que cette liste est une liste fixe.

Arguments du constructeur

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.

Matériel de référence

[Nouvelle édition Refactoring-Safely Improve Existing Code- (OBJECT TECHNOLOGY SERIES)](Lien fixe: http://amzn.asia/c5WxOUh)

Recommended Posts

[Java] Type Express Enum sans utiliser le type Enum (énumération)
Enum (type d'énumération)
[Java] Type d'énumération
Comment formater enum à l'aide de formatter-maven-plugin (Java)
Comment utiliser le type enum Java
[Java] enum (type d'énumération)
Mapper sans utiliser de tableau en java
Remarques sur les opérateurs utilisant Java ~ Type chaîne ~
Conversion de type Java
[Session d'étude interne] Exécution des bases Java sans utiliser l'IDE- (2017/07/06)
Java Type facultatif
[Java] Convertit le code DB en valeur de code à l'aide d'énum
Java double type
[Java débutant] méthode println sans spécification de type de collection
Tri à l'aide du comparateur java
Exemple d'utilisation de Java Enum
[Java] Type de données ①-Type de base
Pratique de grattage avec Java ②
[Swift] Type d'énumération de type partagé
Enum Reverse Map Java
[Java, Kotlin] Variance de type
Champ de type de classe Java
Détermination de type en Java
Étudier Java # 1 (type typique)
Pratique du grattage avec Java ①
Exprimer l'échec en Java
[Java] Conversion de type de date
Je souhaite créer une applet Java sans utiliser d'IDE
Vérifiez l'état des applications Java sans utiliser d'outils de surveillance
[Java8] Utilisez stream pour trier les tableaux de type int dans l'ordre décroissant