我对java对象副本和继承感到好奇。可以说我有以下两个类:
abstract class Algorithm {
public abstract void run();
}
class Specialized extends Algorithm {
@Override
public void run();
}
现在我想测试专门的算法。我真的想与多个实例/参数并行执行此操作。问题是run
方法不可重入,因此我必须有Specialized
的每线程实例。当然,任何类型AlgorithmRunner
都应该与抽象类Algorithm
一起使用,以便能够测试多个不同的特化。问题是我需要以通用的方式从现有的? extends Algorithm
构造一个新的instanceof
。我怎样才能做到这一点?我可以轻松地为每种专业化编写复制构造函数,但这需要使用countries.json
检查切换,我宁愿避免。
答案 0 :(得分:3)
有几种方法可以做到这一点。一种是让Algorithm
具有用于获取实例的抽象工厂方法:
abstract class Algorithm {
public abstract void run();
protected abstract Algorithm buildInstance();
}
class Specialized extends Algorithm {
@Override
public void run() {
// ...
}
@Override
protected Algorithm buildInstance() {
return new Specialized();
}
}
FWIW,我倾向于将AlgorithmRunner
与Algorithm
分开,并让它接受AlgorithmCreator
或与工厂方法类似的实例。
答案 1 :(得分:3)
您可以尝试使用Factory pattern:
interface AlgorithmFactory {
public abstract Algorithm createAlgorithm();
}
class SpecializedFactory implements AlgorithmFactory {
@Override
public Specialized createAlgorithm() {
return new Specialized();
}
}
然后将AlgorithmFactory传递给AlgorithmRunner允许它在不知道其实现的情况下实例化Algorithm的子类。