Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以使用枚举指定类子类型吗?_Java_Oop - Fatal编程技术网

Java 可以使用枚举指定类子类型吗?

Java 可以使用枚举指定类子类型吗?,java,oop,Java,Oop,在java中,使用枚举字段指定类子类型是否可以接受? 就我而言,类型不多(少于20种)。 还是使用继承或内部类更好 目标类别: package example; public class Event{ private EventType eventType; //... } package example; public enum EventType{ TYPE_1, TYPE_2, TYPE_3, //... TYPE_N } 具

在java中,使用枚举字段指定类子类型是否可以接受?
就我而言,类型不多(少于20种)。
还是使用继承或内部类更好

目标类别:

package example;

public class Event{
    private EventType eventType;
    //...
}
package example;

public enum EventType{
    TYPE_1,
    TYPE_2,
    TYPE_3,
    //...
    TYPE_N
}
具有子类型的枚举:

package example;

public class Event{
    private EventType eventType;
    //...
}
package example;

public enum EventType{
    TYPE_1,
    TYPE_2,
    TYPE_3,
    //...
    TYPE_N
}

从面向对象的角度来看,通常最好使用多态性向事件添加不同的行为。因此,创建多个事件类更好。通过使用枚举,每次要添加特殊情况时,最终都会使用switch和if/else语句,因此代码的可维护性会降低,如下所示:

public void doSomething() {

    if(eventType == EVENT_1) {
         ....
    } else if (eventType == EVENT_2) {
         ....
    }
}
public enum EventType {
     FREE_EVENT,  // Use default implementations for methods
     CHARITY_EVENT {
          public void isFree() {
              return false;
          }
          public int cost() {
              return 1000;
          }
     };

     public boolean isFree() {
         return true;
     }

     public int cost() {
         return 0;
     }
}
另一种解决方案是创建枚举,但其行为如下:

public void doSomething() {

    if(eventType == EVENT_1) {
         ....
    } else if (eventType == EVENT_2) {
         ....
    }
}
public enum EventType {
     FREE_EVENT,  // Use default implementations for methods
     CHARITY_EVENT {
          public void isFree() {
              return false;
          }
          public int cost() {
              return 1000;
          }
     };

     public boolean isFree() {
         return true;
     }

     public int cost() {
         return 0;
     }
}

从面向对象的角度来看,通常最好使用多态性向事件添加不同的行为。因此,创建多个事件类更好。通过使用枚举,每次要添加特殊情况时,最终都会使用switch和if/else语句,因此代码的可维护性会降低,如下所示:

public void doSomething() {

    if(eventType == EVENT_1) {
         ....
    } else if (eventType == EVENT_2) {
         ....
    }
}
public enum EventType {
     FREE_EVENT,  // Use default implementations for methods
     CHARITY_EVENT {
          public void isFree() {
              return false;
          }
          public int cost() {
              return 1000;
          }
     };

     public boolean isFree() {
         return true;
     }

     public int cost() {
         return 0;
     }
}
另一种解决方案是创建枚举,但其行为如下:

public void doSomething() {

    if(eventType == EVENT_1) {
         ....
    } else if (eventType == EVENT_2) {
         ....
    }
}
public enum EventType {
     FREE_EVENT,  // Use default implementations for methods
     CHARITY_EVENT {
          public void isFree() {
              return false;
          }
          public int cost() {
              return 1000;
          }
     };

     public boolean isFree() {
         return true;
     }

     public int cost() {
         return 0;
     }
}

欢迎来到堆栈溢出!请拿着这个,四处看看,特别是通读一下,这听起来是个坏主意。以这种方式使用枚举的主要问题是,您开始将switch语句放在所有代码上,这很快会导致维护噩梦。您更应该研究使用继承/多态性的方法。这不是一个好主意,但您应该添加更多细节,以便我们能够指出更好、具体的方法。请阅读我的分析性回答:欢迎使用堆栈溢出!请拿着这个,四处看看,特别是通读一下,这听起来是个坏主意。以这种方式使用枚举的主要问题是,您开始将switch语句放在所有代码上,这很快会导致维护噩梦。您应该研究使用继承/多态性的方法。这不是一个好主意,但您应该添加更多细节,以便我们能够指出更好的方法,具体方法。请阅读我的分析性回答:@Kayaman我通常喜欢接口方法,原因有两个:在
enum
定义中没有抽象方法,并且它支持使用enum测试代码的模拟…希望您不介意编辑。我还从语义上转换了“事件”的含义@TyoToStuple确实可以在其中插入一个接口,但是我不认为缺少抽象的方法是一个问题,嘲讽仍然可以用正确的工具来完成。但是有各种各样的可能性。是的,编辑没有问题。现在用有意义的方法似乎更好@Kayaman“模仿仍然可以用正确的工具完成”,我个人认为PowerMock是对糟糕设计的屈服。在枚举上使用它可能是一个有效的例外,但如果您的项目中有它,则很难忽略它(对于团队成员来说…@TimothyTruckle True,我想说,选择的方法高度依赖于枚举中行为的类型和数量。@Kayaman我通常喜欢接口方法,原因有两个:在
enum
定义中没有抽象方法,并且使用枚举测试代码非常容易模仿……希望您不介意编辑。我还从语义上转换了“事件”的含义@TyoToStuple确实可以在其中插入一个接口,但是我不认为缺少抽象的方法是一个问题,嘲讽仍然可以用正确的工具来完成。但是有各种各样的可能性。是的,编辑没有问题。现在用有意义的方法似乎更好@Kayaman“模仿仍然可以用正确的工具完成”,我个人认为PowerMock是对糟糕设计的屈服。在枚举上使用它可能是一个有效的例外,但是如果您的项目中有它,那么它很难被忽略(对于cause…@TimothyTruckle True的团队成员来说),我要说选择的方法高度依赖于枚举中行为的类型和数量。