【问题标题】:Simplify method in an Enum class in Java简化Java枚举类中的方法
【发布时间】:2011-09-26 22:52:33
【问题描述】:

我有一个包含 Enum 的类来进行计算。 每个 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}

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

【问题讨论】:

    标签: java enums


    【解决方案1】:

    为什么不将外部实例传递给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 {}
    

    【讨论】:

    • 我们的代码示例看起来多么相似!即使我质疑 OP 的设计,我也会为纯粹的正确性给出 +1 :)。为了打败我:(
    • @Perception:+1 质疑 OP 的设计,这正是我的想法。我有兴趣真正了解这里的意图。哦,别忘了,伟大的思想是一样的。 ;-)
    • 在考虑我的答案时完全错过了这种可能性,但当然这会更好。虽然仍然对一些设计感到疑惑。
    【解决方案2】:

    您可以将枚举方法更改为:

    public double calc(Object... params) {
        switch(this) {
            case X:
                // cast params needed for X methodology.
                // doXStuff
                break;
            case y:
                . . . 
        }
    }
    

    【讨论】:

    • 这是一种丑陋的做法,但我猜 +1 效果很好。
    【解决方案3】:

    我注意到您对 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;
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      相关资源
      最近更新 更多