Как я могу разделить функциональность методов, используя перечисление как условие? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий код:

enum Example {

    ex1,ex2

}

public void method(Example exType) {

    if(exType.equals(ex1)) {
        //do similar stuff
        method2(exType)
    } else if(exType.equals(ex2)) {
        //do similar stuff
        method2(exType)
    } else {
        //throw exception
    }

}

public void method2(Example exType) {

    if(exType.equal(ex1)) {
        //do similar stuff
    } else if(exType.equals(ex2)) {
        //do similar stuff
    } else {
        //throw exception
    }
}

Проблема в том, что метод вызывает другие методы, которые ведут себя так же.Так что это выглядит не очень хорошо в качестве реализации.Как я могу разделить это поведение?

Редактировать: Использование enum не является обязательным.Подобный означает, что они вызывают метод с тем же именем и обновляют поля с тем же именем, одно делает меньше другого.Внутри //Do similar stuff он вызывает другой метод с перечислением в качестве параметра, и этот метод имеет ту же структуру кода.

Редактировать 2: Добавлен еще немного кода.Это просто не похоже на правильный подход

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Стоит помнить, что значения Enum являются объектами, а не int значениями, как в других языках.Это позволяет вам использовать полиморфизм с ними, избавляя от необходимости использовать операторы switch во многих случаях.

interface IExample {
   // you can use interfaces if you need them
   void method1();
}

enum Example implements IExample {
    ex1 {
        public void method1() {
            // do stuff
            method2();
        }
        public void method2() {
            // do other stuff
        }
    },
    ex2 {
        public void method1() {
            // do stuff
            method2();
        }
        public void method2() {
            // do other stuff
            method3(); // not all methods need to be different.
        }
    };

    public abstract void method1(); // only needed if you don't use an interface
    public abstract void method2(); // does it need to be public as well?
    public void method3() { /* added as an example */ }
}

Нет необходимости генерировать исключение, поскольку ваш код не будет компилироваться, если вы забудете предоставить реализацию дляновое значение enum.

IExample может быть существующим интерфейсом или может потребоваться для расширения.например,

class Example2 implements IExample {
   int x;
   public Example2(int x) { this.x = x; }
   public void method1() {
       // uses x
   }
}

Теперь вы можете написать

IExample e = Example.ex1; // fixed value

IExample e2 = new Example2(5); // extendable at runtime.

Зачем вы это делаете?

Есть пример, который я использую.

SystemTimeProvider - синглтон, реализованный как enum

SetTimeProvider класс, в котором каждый экземпляр может иметь различное фиксированное время для целей тестирования.

0 голосов
/ 23 ноября 2018

Прежде всего, лучше использовать switch case, потому что в случае, если в будущем больше нет перечислений, а затем больше нет условий if, тогда код станет менее читабельным.

Одним из подходов может быть

enum Example {
  ex1,ex2
}

public void method(Example exType) {

    switch (exType) {
       case ex1:
         methodEx1(); 
         break;
       case ex2:
         methodEx1();  
         break;
       default:
         //throw exception
   }
 }

Функция methodEx1 ();и methodEx2 ();добавьте все коды, соответствующие перечислению в одной функции вместо написания нескольких функций для одного и того же перечисления.

0 голосов
/ 23 ноября 2018

Я бы использовал switch вместо этого.Также с Enums вы можете использовать ==, но вам не нужно это при использовании switch.Как насчет этого!

enum Example {

    ex1,ex2

}

public void method(Example exType) {

    switch (exType) {
         case ex1:
             // do 1
             break;
         case ex2:
             // do 2
             break;
         default:
             //throw exception
    }

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