8

次のような列挙型が定義されているとします。

public enum Sample{
    // suppose AClass.getValue() returns an int
    A(AClass.getValue()), 
    B(AClass.getValue()),
    C(AClass.getValue());

    private int _value; 

    private Sample(int _val){
        this._value = _val; 
    }

    public int getVal(){
        return _value; 
    }

Sample.A問題なく、または問題なく値を引き出すことができますSample.A.getAVal()

AClass.getValue()ここで、パラメータを使用して、おそらく異なる特定の値を返すことができると仮定しますAClass.getValue(42)

パブリックEnumメソッドに引数を渡してEnum値を取得することは可能ですか?言い換えれば、私は次のような列挙型定義を持つことができますか?

    public enum Sample{
        // suppose AClass.getValue() returns an int
        A(AClass.getAValue()), 
        B(AClass.getBValue()),
        C(AClass.getCValue());

        private int _value; 

        private Sample(int _val){
           this._value = _val; 
        }

        public int getVal(){
            return _value; 
        }

        public int getVal(int a){
            // somehow pull out AClass.getAValue(a)
        }

を使用してSample.A.getValue(42)

4

3 に答える 3

6

あなたはそれを行うことができますが、列挙型で抽象メソッドを作成し、各値でそれをオーバーライドすることによってのみ可能です:

public enum Sample {
    A(AClass.getAValue()) {
        @Override public int getVal(int x) {
            return AClass.getAValue(x);
        }
    },
    B(BClass.getAValue()) {
        @Override public int getVal(int x) {
            return BClass.getBValue(x);
        }
    },
    C(CClass.getAValue()) {
        @Override public int getVal(int x) {
            return CClass.getCValue(x);
        }
    };

    private int _value; 

    private Sample(int _val){
       this._value = _val; 
    }

    public int getVal(){
        return _value; 
    }

    public abstract int getVal(int x);
}

もちろん、メソッドを持つ他のgetValue(int x)基本型のインスタンスを作成できる場合は、ネストされたクラスではなく、列挙型クラス自体にコードを配置できます。

于 2013-01-09T16:03:23.837 に答える
3

Java仕様で述べられているように

各列挙型定数のインスタンスは1つだけです

したがって、特定の列挙型定数に異なる値を設定することはできません。

ただし、列挙型内に配列またはマップを配置できるため、次のようSample.A.getValue(42)になりSample.A.myMap.get(42)ます。

public enum Sample{
        A(), 
        B(),
        C();

        Map<Integer, Integer> myMap = new HashMap<Integer, Integer>();


        public int getVal(int i){
            return myMap.get(i); 
        }
        public int setVal(int i, int v){
            return myMap.put(i, v); 
        }
}
于 2013-01-09T16:00:28.370 に答える