【发布时间】:2019-01-07 00:04:08
【问题描述】:
假设我构造了以下类
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?
谢谢
编辑在下方添加了替代答案
【问题讨论】:
-
看起来你真的不应该为此使用枚举。除了您询问的问题之外,您还可变地使用枚举,这是非常可疑的。看来您应该编写一些普通的构建器或其他东西。 (为了记录,这里没有任何技巧可以让它工作。只是不要使用枚举。)
-
@Radiodef 我只是想以某种方式呈现 api - 我可以通过其他方式使其工作。
-
您可以通过使用公共静态最终字段而不是枚举值以相同的方式为您的客户呈现 API。