Définir des méthodes abstraites dans l'énumération Java et écrire leur comportement

Aperçu

Cette entrée traite de la définition de méthodes abstraites dans l'énumération Java et de l'écriture de leur comportement. (Celui écrit dans la 3e édition de Effective Java est presque le même. Notez ce que vous avez essayé.)

Énumération Java

Java enum vous permet de définir des méthodes ainsi que des valeurs.

Motif qui définit uniquement la valeur

    enum Operator {
        PLUS, SUBTRACT, MULTIPLY, DIVIDE, NONE
    }

D'autre part, vous pouvez définir une méthode pour chaque valeur et l'écrire comme indiqué dans la figure ci-dessous.

    enum Operator {
        PLUS {
            @Override
            BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
                return lhs.add(rhs);
            }
        },
        SUBTRACT{
            @Override
            BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
                return lhs.subtract(rhs);
            }
        },
        MULTIPLY {
            @Override
            BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
                return lhs.multiply(rhs);
            }
        },
        DIVIDE {
            @Override
            BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
                return lhs.divide(rhs, BigDecimal.ROUND_UNNECESSARY);//;
            }
        },
        NONE {
            // allow null for rhs
            @Override
            BigDecimal apply(@NonNull BigDecimal lhs, BigDecimal rhs) {
                return lhs;
            }
        };

        abstract BigDecimal apply(BigDecimal lhs, BigDecimal rhs);
    }

Dans "abstract BigDecimal apply (BigDecimal lhs, BigDecimal rhs);" dans enum, la méthode à définir pour toutes les valeurs est spécifiée, et la méthode est remplacée lorsque chaque valeur est déclarée.

(Supplément) Dans la source ci-dessus, "@NonNull" est l'une des Annotations fournies par lombok qui implémente la vérification Null. est.

Exemple d'utilisation

Si vous définissez enum dans le formulaire ci-dessus, par exemple, la méthode suivante


    public synchronized BigDecimal pushEvalButton() {
        var v = new BigDecimal(sb.toString());
        switch(currentOperator) {
            case PLUS: {
                v = stack.add(getCurrentValue());
                break;
            }
            case SUBTRACT: {
                  v = stack.subtract(getCurrentValue());
                  break;
            }
            case MULTIPLY: {
                  v = stack.multiply(getCurrentValue());
                  break;
            }
            case DIVIDE: {
                  v = stack.divide(getCurrentValue(), BigDecimal.ROUND_UNNECESSARY);//
                  break;
            }
            case NONE: {
                return v;
            }
            default: {
                throw new RuntimeException("Not defined.");
            }
        }
        currentOperator = Operator.NONE;
        replaceBuffer(v.toPlainString());
        clearStack();
        return v;
    }

Vous pouvez écrire clairement comme suit.


    public synchronized BigDecimal pushEvalButton() {
        var v = new BigDecimal(sb.toString());

        if(Operator.NONE == currentOperator) {
            return v;
        }
        v = currentOperator.apply(stack, getCurrentValue());
        currentOperator = Operator.NONE;
        replaceBuffer(v.toPlainString());
        clearStack();
        return v;
    }

Étant donné que le contenu est passé à la méthode enum, il est naturel que le code soit réduit par rapport à la méthode d'origine, mais j'ai estimé que ce qui suit était méritoire.

Résumé

Dans cette entrée, j'ai montré un exemple de définition de méthodes abstraites dans une énumération Java et d'écriture de leur comportement.

Voir [This commit] sur GitHub (https://github.com/hrkt/commandline-calculator/commit/47e7b05075c2bb632b9bdabdf044ab3b5cefdeee) pour un exemple des différences ci-dessus.

Recommended Posts

Définir des méthodes abstraites dans l'énumération Java et écrire leur comportement
Vérifier le comportement statique et public dans les méthodes Java
Méthodes et classes abstraites Java
Cours et méthodes abstraits d'histoire d'apprentissage JAVA
Ecrire une classe en Kotlin et l'appeler en Java
Soustraire les constantes Enum des chaînes et des valeurs en Java
Utilisation correcte de la classe abstraite et de l'interface en Java
[Java] Classe générique et méthode générique
Ecrire des rappels de vol en Java
Modèle de stratégie Enum en Java
Méthodes Java et surcharges de méthodes
Pensez aux différences entre les fonctions et les méthodes (en Java)
Reproduire l'énumération Java en C #
À propos de la classe abstraite Java
Différences de comportement par défaut de la mémoire et de la reconnaissance du processeur sur kubernetes (GKE) pour chaque version de Java
Créez une énumération haute performance avec des champs et des méthodes comme Java avec JavaScript
À propos des méthodes Java statiques et non statiques
Exemple d'encodage et de décodage en Java
Etudier Java 8 (méthode StaticIF et Default)
Comprendre equals et hashCode en Java
Java Generics (définit les classes et les méthodes)
Bonjour tout le monde en Java et Gradle
Exemple de code pour la sérialisation et la désérialisation des énumérations Java Enum et JSON dans Jackson
Une note sur les différences entre les interfaces et les classes abstraites en Java
[Java] Comment sortir et écrire des fichiers!
Programmation Java (classes et instances, méthodes principales)
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
De Java à C et de C à Java dans Android Studio
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur