假设我构建了以下类
public enum OptimizationAlgorithmType {
VANILLA(new HashMap<String, Double>()) {
private final static String ETA = "eta";
private Double eta = null;
public OptimizationAlgorithmType setEta(Double eta) {
this.eta = eta;
return this;
}
@Override
public Map<String, Double> getHyperarameters() {
this.map.put(ETA, eta);
return this.map;
}
},
MOMENTUM(new HashMap<String, Double>()) {
private final static String ALPHA = "alpha";
private final static String BETA = "beta";
private Double alpha = null;
private Double beta = null;
public OptimizationAlgorithmType setAlpha(Double alpha) {
this.alpha = alpha;
return this;
}
public OptimizationAlgorithmType setBeta(Double beta) {
this.beta = beta;
return this;
}
@Override
public Map<String, Double> getHyperarameters() {
this.map.put(ALPHA, alpha);
this.map.put(BETA, beta);
return this.map;
}
};
protected Map<String, Double> map;
private OptimizationAlgorithmType(Map<String, Double> map) {
this.map = map;
}
public abstract Map<String, Double> getHyperarameters();
}
我的目标是构建一个 API,当我选择一个特定的 Enum 时,不同的方法将可用。例如
MultiThreadBackpropagation backpropagation = new MultiThreadBackpropagation(feedForward)
.setNumberThreads(10)
.setBatch(5)
.setEpochs(100)
.setOptimizer(OptimizationAlgorithmType.VANILLA.setEta(0.001));
或者
MultiThreadBackpropagation backpropagation = new MultiThreadBackpropagation(feedForward)
.setNumberThreads(10)
.setBatch(5)
.setEpochs(100)
.setOptimizer(OptimizationAlgorithmType.MOMENTUM.setAlpha(0.01).setBeta(0.99));
不幸的是,这是不允许的。该 ide 警告未使用的方法(即:setEta()
)- 并且这些方法根本无法从特定枚举中选择。
我可以使用什么技巧来获得所需的 API?
谢谢
编辑在下面添加了一个备选答案
最佳答案
我想出了一些更好的
先是接口(interface),再是实现接口(interface)的两个参数类
public interface Hyperparameter {...}
public enum VanillaParameter implements Hyperparameter {
ETA {
@Override
public Double getValue() {
return this.etaValue;
}
@Override
public void setValue(Double value) {
if (value == null) {
throw new IllegalStateException("Parameter value cannot be set to null!");
}
this.etaValue = value;
}
};
protected Double etaValue = 0.005;
}
public enum MomentumParameter implements Hyperparameter {
...
}
现在添加主要的枚举类
public enum OptimizationType {
VANILLA{
private VanillaParameter eta = VanillaParameter.ETA;
@Override
public Hyperparameter get(Hyperparameter parameter) {
switch ((VanillaParameter) parameter) {
case ETA: return this.eta;
}
return null;
}
@Override
public OptimizationType set(Hyperparameter parameter, Double value) {
switch ((VanillaParameter) parameter) {
case ETA:
this.eta.setValue(value);
break;
}
return OptimizationType.VANILLA;
}
},
...
}
在我看来,该 API 看起来非常好并且符合我的初衷。期待建议
MultiThreadBackpropagation backpropagation = new MultiThreadBackpropagation.BackpropagationBuilder(feedForward)
.setBatch(5)
.setEpochs(100)
.setThreads(10)
.setOptimizer(OptimizationType.MOMENTUM
.set(MomentumParameter.ALPHA, 0.001)
.set(MomentumParameter.BETA, 0.92))
.build();
关于java - 在 Java 中实现不同方法的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54067082/