复制构造函数和继承
Copy constructor and inheritance
我很好奇 java 对象复制和继承。假设我有以下两个 classes:
abstract class Algorithm {
public abstract void run();
}
class Specialized extends Algorithm {
@Override
public void run();
}
现在我想测试一下专门的算法。我真的很想与多个实例/参数并行执行此操作。问题是 run
方法不可重入,所以我必须有 Specialized
的每个线程实例。当然,任何一种 AlgorithmRunner
都应该与抽象 class Algorithm
一起工作,以便能够测试多个不同的专业化。问题是我需要以通用方式从现有的 ? extends Algorithm
构建一个新的。我怎样才能做到这一点?我可以轻松地为每种专业化编写复制构造函数,但这需要使用我宁愿避免的 instanceof
检查进行切换。
有几种方法可以做到这一点。一种是让 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
或类似工厂方法的实例。
您可以尝试使用 Factory pattern:
interface AlgorithmFactory {
public abstract Algorithm createAlgorithm();
}
class SpecializedFactory implements AlgorithmFactory {
@Override
public Specialized createAlgorithm() {
return new Specialized();
}
}
然后将 AlgorithmFactory 传递给 AlgorithmRunner 允许它在不知道其实现的情况下实例化 Algorithm 的子类。
我很好奇 java 对象复制和继承。假设我有以下两个 classes:
abstract class Algorithm {
public abstract void run();
}
class Specialized extends Algorithm {
@Override
public void run();
}
现在我想测试一下专门的算法。我真的很想与多个实例/参数并行执行此操作。问题是 run
方法不可重入,所以我必须有 Specialized
的每个线程实例。当然,任何一种 AlgorithmRunner
都应该与抽象 class Algorithm
一起工作,以便能够测试多个不同的专业化。问题是我需要以通用方式从现有的 ? extends Algorithm
构建一个新的。我怎样才能做到这一点?我可以轻松地为每种专业化编写复制构造函数,但这需要使用我宁愿避免的 instanceof
检查进行切换。
有几种方法可以做到这一点。一种是让 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
或类似工厂方法的实例。
您可以尝试使用 Factory pattern:
interface AlgorithmFactory {
public abstract Algorithm createAlgorithm();
}
class SpecializedFactory implements AlgorithmFactory {
@Override
public Specialized createAlgorithm() {
return new Specialized();
}
}
然后将 AlgorithmFactory 传递给 AlgorithmRunner 允许它在不知道其实现的情况下实例化 Algorithm 的子类。