Упростить метод в классе Enum в Java - PullRequest
5 голосов
/ 01 июля 2011

У меня есть класс, который содержит 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}

Но если у меня будет больше классов, параметр будет выглядеть слишком некрасиво. Есть ли лучший способ сделать это?

Ответы [ 3 ]

10 голосов
/ 01 июля 2011

Почему бы вам не передать экземпляр external методу 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 {}
2 голосов
/ 01 июля 2011

Вы можете изменить свой метод перечисления на:

public double calc(Object... params) {
    switch(this) {
        case X:
            // cast params needed for X methodology.
            // doXStuff
            break;
        case y:
            . . . 
    }
}
0 голосов
/ 24 мая 2018

Я заметил, что у вас есть другая реализация метода для значений 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;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...