假设我的枚举定义如下:
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方法并检索枚举值吗?换句话说,我可以使用像
这样的枚举定义 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)
?
答案 0 :(得分: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)
方法的其他基类型的实例,那么您可以将代码放入枚举类本身而不是嵌套的类中。
答案 1 :(得分: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);
}
}
答案 2 :(得分:-3)
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