gpt4 book ai didi

java - 有什么方法可以用一种动态类实例化的形式来简化这个?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:50:43 26 4
gpt4 key购买 nike

我有几个扩展父类的子类,被迫有一个统一的构造函数。我有一个队列,其中包含这些类的列表,这些类必须扩展 MergeHeuristic。我目前拥有的代码如下所示:

    Class<? extends MergeHeuristic> heuristicRequest = _heuristicQueue.pop();
MergeHeuristic heuristic = null;

if(heuristicRequest == AdjacentMACs.class)
heuristic = new AdjacentMACs(_parent);
if(heuristicRequest == SimilarInterfaceNames.class)
heuristic = new SimilarInterfaceNames(_parent);
if(heuristicRequest == SameMAC.class)
heuristic = new SameMAC(_parent);

有什么方法可以简化动态实例化类的过程,大致如下:

heuristic = new heuristicRequest.somethingSpecial();

这会压扁那 block if 语句。

最佳答案

看起来您正在使用队列中的类作为一种标志来指示要实例化的请求类型。另一种不使用反射的方法是通过引入一个枚举来指示请求类型,并使用工厂方法使此标志行为显式:

public enum HeuristicType {

AdjacentMACsHeuristic(AdjacentMACs.class) {
@Override public MergeHeuristic newHeuristic(ParentClass parent) {
return new AdjacentMACs(parent);
}
},
SimilarInterfaceNamesHeuristic(SimilarInterfaceNames.class) {
@Override public MergeHeuristic newHeuristic(ParentClass parent) {
return new SimilarInterfaceNames(parent);
}
},
... // other types here.
;

private final Class<? extends MergeHeuristic> heuristicClass;
public Class<? extends MergeHeuristic> getHeuristicClass() {
return heuristicClass;
}

abstract public MergeHeuristic newHeuristic(ParentClass parent);

private HeuristicType(Class<? extends MergeHeuristic> klass) {
this.heuristicClass = klass;
}

}

然后您的客户端代码变为:

Queue<HeuristicType> _heuristicQueue = ...
HeuristicType heuristicRequest = _heuristicQueue.pop();
MergeHeuristic heuristic = heuristicRequest.newHeuristic(_parent);

与反射相比,使用枚举的主要优点是:

  • 您明确说明了添加新启发式类型的要求,即必须有一个启发式类,并且您必须能够基于父级对其进行实例化。
  • 您在系统中有一个点,您可以在其中查看所有可用的启发式类型。
  • 通过将实例化抽象为工厂方法,您可以使用替代构造函数签名。

关于java - 有什么方法可以用一种动态类实例化的形式来简化这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13477192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com