假设我有一个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.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)
?
您可以做到这一点,但只能在枚举中创建一个抽象方法,并在每个值中重写它:
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