简化Java中Enum类的方法

时间:2011-07-01 18:03:47

标签: java enums

我有一个包含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}

但如果我有更多的类,那么参数看起来会太难看了。有没有更好的方法来做这种事情?

3 个答案:

答案 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;
        }
    }

}