Javaの列挙クラスEnumについて

6056 ワード

キーワードenumはJDK 5が新たに導入した特性である.列挙は開発に多くの便利さを提供した.まず列挙とは何かを見てみましょうJavaプログラミング思想で定義し、
キーワードenumは、名前付き値の有限集合のセットを新しいタイプに作成することができる.
個人的には、列挙は有限個のクラスをインスタンス化し、クラスのデータと動作を定義することができることを理解しています.通常のクラスとは異なり、エニュメレーションは他のクラスを継承できません.Enumクラスが継承されているため、複数のインタフェースを実装することもできます.エニュメレーションクラスでは抽象メソッドを宣言したり、インスタンスメソッド、クラスメソッドを宣言したりすることができます.まず最も簡単な例を見てみましょう
public enum Number {
    ONE,
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT,
    NINE,
    TEN;
}

この列挙クラスの定義の意味は,Numberのクラスがあると理解でき,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TENなどがインスタンスオブジェクトである.Number列挙クラスの配列はvalues()法により得ることができる.
        Number[] numbers = Number.values();
        for(Number number:numbers){
            System.out.println(number);
        }

実行結果:
ONE
TWO
THREE
FOUR
FIVE
SIX
SEVEN
EIGHT
NINE
TEN

キーワードenumで宣言されたクラスは、デフォルトではEnumクラスが継承されており、親EnumにはtoString()メソッドがあるので、印刷されたのはインスタンスの名前です.
では、Numberクラスにコンストラクタを追加してみましょう.

public enum Number {
    ONE(1),
    TWO(2),
    THREE(3),
    FOUR(4),
    FIVE(5),
    SIX(6),
    SEVEN(7),
    EIGHT(8),
    NINE(9),
    TEN(10);

    final private int value;

    Number(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

この例では,実際の開発でよく用いられる.以前は定数クラスを定義して定義していました.
public class NumberConstant {

    public static int ONE = 1;
    public static int TWO = 2;
    public static int THREE = 3;
    public static int FOUR = 4;
    public static int FIVE = 5;
    public static int SIX = 6;
    public static int SEVEN = 7;
    public static int EIGHT = 8;
    public static int NINE = 9;
    public static int TEN = 10;
    
}

『Effective Java』では、
上記のクラスのint列挙はコンパイル時定数であり,それらを使用するクライアントにコンパイルされる.列挙定数に関連付けられたintが変更された場合、クライアントは再コンパイルする必要がありますが、Java列挙タイプは必要ありません.
はい、コンストラクタがあります.Java列挙クラスに普通のインスタンスメソッドを追加しましょう.実は上のgetValue()は普通のインスタンスメソッドです.比較的簡単で、このように直接呼び出すことができます.
System.out.println(Number.ONE.getValue());


では、次にNumberクラスに抽象的な方法を追加しましょう.
package com.example.myenum;

public enum Number {
    ONE(1){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    TWO(2){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    THREE(3){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    FOUR(4){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    FIVE(5){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    SIX(6){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    SEVEN(7){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    EIGHT(8){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    NINE(9){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    TEN(10){
        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    };

    final private int value;

    Number(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    abstract public void print();


もちろん、抽象的な方法を定義する以外に、インタフェースを実現することもできます.
package com.example.myenum;

public enum Number implements INumber{
    ONE(1){
        @Override
        public int plus() {
            return this.getValue()+this.getValue();
        }

        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    TWO(2){
        @Override
        public int plus() {
            return this.getValue()+this.getValue();
        }

        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    },
    THREE(3){
        @Override
        public int plus() {
            return this.getValue()+this.getValue();
        }

        @Override
        public void print() {
            System.out.println(this.getValue());
        }
    };
   ;

    final private int value;

    Number(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    abstract public void print();
}


Java列挙タイプは、定数を定義するためによく使用されます.以下に、最も簡単な加算減算の実現方法を実現する.
public class Calculator {
    public static void main(String[] args) {
        System.out.println(cal(1.5,3.5,'+'));
        //System.out.println(CalculatorEnum.PLUS.cal(1.5,3.5));
    }

    public static double cal(double x,double y,char c){
        switch (c){
            case '+':
                return x+y;

            case '-':
                return x-y;

            case '*':
                return x*y;

            case '/':
                return x/y;

            default:
                throw new ArithmeticException("  ");

        }
    }
}

列挙で実現してみましょう
package com.example.myenum;

public enum  CalculatorEnum {
    PLUS{
        @Override
        public double cal(double x,double y) {
            return x+y;
        }
    },
    MINUS{
        @Override
        public double cal(double x,double y) {
            return x-y;
        }
    },
    MULTI{
        @Override
        public double cal(double x,double y) {
            return x*y;
        }
    },
    DEVILE{
        @Override
        public double cal(double x,double y) {
            return x/y;
        }
    };
    abstract public double cal(double x,double y);
}


優雅な感じがしますか.
以上は個人的な理解ですが、不正な点があれば、ご指摘ください.