是否可以将参数传递到枚举值中



假设我有一个Enum定义如下:

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.ASample.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)

您可以做到这一点,但只能在枚举中创建一个抽象方法,并在每个值中重写它:

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)方法的其他基类型的实例,那么您可以将代码放入枚举类本身,而不是嵌套类中。

如Java规范中所述

每个枚举常量只有一个实例

所以,不,一个特定枚举常量不能有不同的值。

但是您可以在枚举中放入一个数组或映射,因此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); 
        }
}
public class App {
    public static void main(String[] args) {
        Fruit.setCounter(5);
        System.out.println(Fruit.Apple.getCmd());
        Fruit.setCounter(6);
        System.out.println(Fruit.Apple.getCmd());
    }
}
public enum Fruit {
    Apple {
        public String getCmd() {
            return counter + " apples";
        }
    },
    Banana {
        public String getCmd() {
            return counter + " bananas";
        }
    };
    private static int counter = 0;
    public abstract String getCmd();
    public static void setCounter(int c) {
        counter = c;
    }
}


Output:
5 apples
6 apples

相关内容

  • 没有找到相关文章

最新更新