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

Java 如何使用枚举作为条件拆分方法功能?,java,oop,design-patterns,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) }

我有以下代码:

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
    }
}
问题是该方法调用了其他行为方式相同的方法。所以它作为一个实现看起来不是很好。我该如何分割这种行为

编辑: 使用枚举不是强制性的。相似意味着它们调用相同的命名方法并更新相同的命名字段,一个只做的比另一个少。在
//执行类似操作
中,它调用另一个以枚举为参数的方法,该方法具有相同的代码结构

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

我会使用
开关
。使用
枚举
时,您可以使用
=
,但在使用
开关
时不需要。这个怎么样

enum Example {

    ex1,ex2

}

public void method(Example exType) {

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

}

值得记住的是,枚举值是对象,而不是像其他语言中那样的
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
可能是现有接口,也可能是扩展所需的接口。e、 g

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.

你为什么要这样做?

我举了一个例子

-实现为
enum


一种类,其中每个实例都可以有不同的固定时间进行测试。

首先最好使用
开关大小写
,因为在将来的情况下,枚举的数量会更多,如果条件更多,那么代码的可读性就会变差

其中一种方法可能是

enum Example {
  ex1,ex2
}

public void method(Example exType) {

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

函数methodEx1();方法2();在一个函数中添加与enum对应的所有代码,而不是为同一个enum编写多个函数。

是否必须使用enum?类似的东西是什么?是调用相同的命名方法还是更新相同的命名字段不强制使用枚举。它正在调用相同的命名方法并更新相同的命名字段,但其中一个比另一个做得少。@D.Tomov:谢谢您的编辑。但我看不出您的代码有什么问题(尽管我会使用
开关
)。请解释为什么您认为这看起来不是一个好的实现,以及拆分此行为的含义。什么行为?@D.Tomov我添加了一个接口和一个常用方法,以防它们有用。因为/do东西调用另一个必须具有相同逻辑的方法。我将不得不再次使用它的开关。对不起,这没用。如果是那样,请重新解释你的问题。不清楚你在追求什么。