我有一个包含Enum的类来进行计算。 每个枚举使用外部类中的部分或全部非静态变量。但是因为它们无法访问实例变量,所以我必须将它们作为参数传递。
public class Outer{
ClassA a;
ClassB b;
ClassC c;
Map<MyEnum,Double> results= new EnumMap(MyEnum.class);
private enum MyEnum{
X{ public double calc(ClassA _a){ dostuff } },
Y{ public double calc(ClassB _b,ClassC _c){ dostuff } },
Z{ public double calc(ClassA _a,ClassB _b){ dostuff } };
}
public void doCalc(){
for(MyEnum item:MyEnum.values()){
result.get(item) = item.calc(...);//Not uniform here
}
}
}
我的问题是我无法通过统一的方式传递for循环中的参数。我可以使每个Enum方法都采用所有类,如
public double calc(ClassA _a,ClassB _b,ClassC _c){ dostuff}
但如果我有更多的类,那么参数看起来会太难看了。有没有更好的方法来做这种事情?
答案 0 :(得分:10)
为什么不将外部实例传递给calc()
方法。在这种情况下,每个特定的枚举将具有相应处理Outer
对象的逻辑,并且新的枚举不需要任何更改。
class Outer {
ClassA a;
ClassB b;
ClassC c;
Map<MyEnum,Double> results= new EnumMap<MyEnum, Double>(MyEnum.class);
private enum MyEnum{
X{ public void calc(Outer o){ } },
Y{ public void calc(Outer o){ } },
Z{ public void calc(Outer o){ } };
abstract void calc(Outer o);
}
public void doCalc(){
for(MyEnum item:MyEnum.values()){
item.calc(this);
}
}
}
class ClassA {}
class ClassB {}
class ClassC {}
答案 1 :(得分:2)
您可以将枚举方法更改为:
public double calc(Object... params) {
switch(this) {
case X:
// cast params needed for X methodology.
// doXStuff
break;
case y:
. . .
}
}
答案 2 :(得分:0)
我注意到你对ENUM值有不同的方法实现 在Java 8上,您可以使用BiFunction:
public static class Outer {
Map<MyEnum, Double> results = new EnumMap(MyEnum.class);
public enum MyEnum {
X(defaultdoStuff1()),
Y(defaultdoStuff1()),
Z(defaultdoStuff2());
MyEnum(BiFunction<Object, Integer, Boolean> objectIntegerBooleanBiFunction) {
this.handler = objectIntegerBooleanBiFunction;
}
private BiFunction<Object, Integer, Boolean> handler;
private static BiFunction<Object, Integer, Boolean> defaultdoStuff2() {
//do stuff
return (obj, age) -> (age > 0) || obj != null;
}
private static BiFunction<Object, Integer, Boolean> defaultdoStuff1() {
//do stuff
return (obj, age) -> false;
}
}
}