单独的Java文件中的特定于常量的枚举类类

那里:

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

我要完成的任务的简要概述:我想在一个自写的仿真框架中测试不同的预处理程序。每种预处理方式最多包含数百行代码。

我用以下方法创建了一个枚举类:

public enum PreProcessorType implements preprocessorUsable {

    NoPreprocessing {
        @Override
        someMethod()
    },

    SomePreprocessing {
        @Override
        someMethod()
    },

    FullPreprocessing {
        @Override
        someMethod()
    }
}

现在,每种预处理类型的所有这些多种方法都变得非常大,使得整个PreProcessorType类不可读。是否有将内容放入另一个Java文件的巧妙方法?还是这会破坏枚举(“常量特定”)类主体的整体思想?

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

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

for (PreProccesorType p : preprocessortypes){
    // do the preprocessing
    p.someMethod();
    
    // run the actual simulation
    runSimulation();
}

一种替代方法是:对于每种预处理方法,使用相应的类和所有必需的方法(实现所需的接口)编写一个单独的Java文件。

有没有一种方法可以确保这种“枚举”方法的安全,并且可以将每种类型的特定于常量的部分存储在单独的Java文件中以提高可读性?

先感谢您!

如果在设计上有重大误解,也请告诉我。

尼克:

您将无法将枚举主体保存到不同的类文件中。您可以使用每种预处理类型的单独的类文件来完成相同的操作:

interface PreprocessorUsable { 
    default void someMethod() {} 
}
class NoPreprocessing implements PreprocessorUsable {}
class SomePreprocessing implements PreprocessorUsable {}
class FullPreprocessing implements PreprocessorUsable {}

然后让PreProcessorType枚举仅保存对实现的引用。

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

您将像这样使用它:

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

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

    // run the actual simulation
    runSimulation();
}

或者,使用仅包含不同实现的静态常量的类。

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();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章