我目前正在扩展离散事件模拟,并且(来自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] 删除。
我来说两句