单独java文件中枚举的常量特定类主体

单独java文件中枚举的常量特定类主体,java,enums,Java,Enums,我目前正在扩展一个离散事件模拟,并且(来自Python)对Java的一些设计模式很难理解 快速概述我正在努力实现的目标: 我想在自己编写的模拟框架中测试不同的预处理过程。 每种预处理方式都包含多达几百行代码 我创建了一个枚举类,其中包含: public enum PreProcessorType implements preprocessorUsable { NoPreprocessing { @Override someMethod() },

我目前正在扩展一个离散事件模拟,并且(来自Python)对Java的一些设计模式很难理解

快速概述我正在努力实现的目标: 我想在自己编写的模拟框架中测试不同的预处理过程。 每种预处理方式都包含多达几百行代码

我创建了一个枚举类,其中包含:

public enum PreProcessorType implements preprocessorUsable {

    NoPreprocessing {
        @Override
        someMethod()
    },

    SomePreprocessing {
        @Override
        someMethod()
    },

    FullPreprocessing {
        @Override
        someMethod()
    }
}
现在,每个预处理类型的所有这些多个方法都变得非常大,使得整个预处理类型类无法读取。是否可以将内容放在不同的java文件中?或者,这是否破坏了枚举的(“常量特定”)类主体的整个概念

我创建此预处理作为枚举的最初原因是,我可以在模拟框架中轻松地对其进行迭代,如下所示:

PreProcessorType[] preprocessortypes = {PreProcessorType.NoPreprocessing,
                                        PreProcessorType.SomePreprocessing,
                                        PreProcessorType.FullPreprocessing}

for (PreProccesorType p : preprocessortypes){
    // do the preprocessing
    p.someMethod();
    
    // run the actual simulation
    runSimulation();
}
另一种选择是: 对于每种预处理方法,编写一个单独的java文件,其中包含相应的类和所有必要的方法(实现所需的接口)

有没有一种方法可以确保这种“enum”方法的安全性,并简单地将每种类型的常量特定部分存储在一个单独的java文件中以便于可读

提前谢谢你


如果对此处的设计存在重大误解,请告知我。

您将无法将枚举正文保存到不同的类文件中。对于每种预处理类型,可以使用单独的类文件完成相同的任务:

interface PreprocessorUsable { 
    default void someMethod() {} 
}
class NoPreprocessing implements PreprocessorUsable {}
class SomePreprocessing implements PreprocessorUsable {}
class FullPreprocessing implements PreprocessorUsable {}
然后让PrefortOrtypeEnum只保存对实现的引用

public enum PreProcessorType {
    NoPreprocessing(new NoPreprocessing()),
    SomePreprocessing(new SomePreprocessing()),
    FullPreprocessing(new FullPreprocessing());

    final PreprocessorUsable preprocessor;

    PreProcessorType(PreprocessorUsable preprocessor) {
        this.preprocessor = preprocessor;
    }

    public PreprocessorUsable getPreprocessor() {
        return preprocessor;
    }
}
class PreProcessorTypes {
    public static final PreprocessorUsable NO_PREPROCESSING = new NoPreprocessing();
    public static final PreprocessorUsable SOME_PREPROCESSING = new SomePreprocessing();
    public static final PreprocessorUsable FULL_PREPROCESSING = new FullPreprocessing();
}
您可以这样使用它:

PreProcessorType[] preprocessortypes = {PreProcessorType.NoPreprocessing,
    PreProcessorType.SomePreprocessing,
    PreProcessorType.FullPreprocessing};

for (PreProcessorType p : preprocessortypes){
    // do the preprocessing
    p.getPreprocessor().someMethod();

    // run the actual simulation
    runSimulation();
}
或者,使用一个只保存不同实现的静态常量的类

public enum PreProcessorType {
    NoPreprocessing(new NoPreprocessing()),
    SomePreprocessing(new SomePreprocessing()),
    FullPreprocessing(new FullPreprocessing());

    final PreprocessorUsable preprocessor;

    PreProcessorType(PreprocessorUsable preprocessor) {
        this.preprocessor = preprocessor;
    }

    public PreprocessorUsable getPreprocessor() {
        return preprocessor;
    }
}
class PreProcessorTypes {
    public static final PreprocessorUsable NO_PREPROCESSING = new NoPreprocessing();
    public static final PreprocessorUsable SOME_PREPROCESSING = new SomePreprocessing();
    public static final PreprocessorUsable FULL_PREPROCESSING = new FullPreprocessing();
}
现在,您将使用实例而不是枚举:

PreprocessorUsable preprocessors = {PreProcessorTypes.NO_PREPROCESSING,
    PreProcessorTypes.SOME_PREPROCESSING,
    PreProcessorTypes.FULL_PREPROCESSING};

for (PreprocessorUsable p : preprocessors){
    // do the preprocessing
    p.someMethod();

    // run the actual simulation
    runSimulation();
}

非常感谢您的全面和及时的回复。非常感谢!