如何使用枚举作为条件拆分方法功能?

时间:2018-11-23 06:41:50

标签: java oop design-patterns

我有以下代码:

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
    }
}

问题在于该方法调用行为相同的其他方法。因此,它看起来不是很好的实现。我该如何分割这种行为?

编辑: 使用枚举不是强制性的。类似的意思是他们调用了同名方法并更新了同名字段,一个只比另一个少。在//Do similar stuff内部,它调用另一个以枚举为参数的方法,该方法具有相同的代码结构。

编辑2: 添加了更多代码。这似乎不是正确的方法

3 个答案:

答案 0 :(得分:2)

值得记住的是,枚举值是对象,而不是像其他语言中的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一个类,其中每个实例出于测试目的可以具有不同的固定时间。

答案 1 :(得分:0)

我会改用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
    }

}

答案 2 :(得分:0)

首先最好使用switch case,因为在将来的情况下,枚举数将更多,如果条件使代码的可读性降低,则数将变得更多。

一种方法可能是

enum Example {
  ex1,ex2
}

public void method(Example exType) {

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

函数methodEx1();和methodEx2();将与枚举对应的所有代码添加到一个函数中,而不是为同一个枚举编写多个函数。