[JAVA] utiliser enum au lieu de la constante int

motif d'énumération int

Mauvaise expressivité. Passer Apple à la méthode attend l'orange Même si vous comparez Apple et Orange avec l'opérateur ==, le compilateur ne se mettra pas en colère.

public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;

public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;

Lors de l'utilisation enum

public enum Apple {FUJI, PIPIN, GRANNY_SMITH}
public enum Orange {NAVEL, TEMPLE, BLOOD}

Enum type pour basculer par valeur

Dans le code ci-dessous, il est techniquement accessible jusqu'à la fin de la méthode, Il y a un problème comme oublier d'ajouter un cas correspondant au commutateur

public enum Operation {
		PLUS, MINUS, TIMES, DIVID;

		//Effectuer des opérations arithmétiques représentées par des constantes
		public double apply(double x, double y) {
			switch(this) {
			case PLUS:
				return x + y;
			case MINUS :
				return x - y;
			case TIMES:
				return x * y;
			case DIVID:
				return x / y;
			}
			throw new AssertionError("Unknown op" + this);
		}
	}

Le problème peut être amélioré en définissant une méthode abstraite et en remplaçant la méthode abstraite pour chaque constante.

public enum Operation {
		PLUS {
			public double apply(double x, double y) {
				return x + y;
			}
		},
		MINUS {
			public double apply(double x, double y) {
				return x - y;
			}
		},
		TIMES {
			public double apply(double x, double y) {
				return x * y;
			}
		},
		DIVIDE {
			public double apply(double x, double y) {
				return x + y;
			}
		};
		public abstract double apply(double x, double y);
	}

Appliquer de manière plus concise en utilisant lambda


public enum Operation {
    PLUS((x, y) -> x + y),
    MINNUS((x, y) -> x - y),
    TIMES ((x, y) -> x * y),
    DIVIDE ((x, y) -> x / y);

    private final DoubleBinaryOperator op;

    Operation (DoubleBinaryOperator op) {
        this.op = op;
    }

    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }
}

Recommended Posts

utiliser enum au lieu de la constante int
Élément 36: utiliser EnumSet au lieu de champs de bits
Point 37: Utilisez EnumMap au lieu de l'indexation ordinale
[Java] Pourquoi utiliser StringUtils.isEmpty () au lieu de String.isEmpty ()
[Java] utilise facultatif au lieu de if (hoge! = Null) {...}
Utilisation de la classe Date
[Swift] Pourquoi FlowLayout devrait utiliser Delegate au lieu de l'instance
[Rails] Comment utiliser enum
[Rails] Comment utiliser enum
Utilisez @ValueSource de ParametrisedTest de JUnit5