Java 复制构造函数和继承

Java 复制构造函数和继承,java,inheritance,copy-constructor,Java,Inheritance,Copy Constructor,我对java对象拷贝和继承很好奇。假设我有以下两个类: abstract class Algorithm { public abstract void run(); } class Specialized extends Algorithm { @Override public void run(); } 现在我想测试专门的算法。我真的很想与多个实例/参数并行执行此操作。问题是run方法是不可重入的,因此我必须有专用的的每个线程实例。当然,任何类型的AlgorithmRunner

我对java对象拷贝和继承很好奇。假设我有以下两个类:

abstract class Algorithm {
  public abstract void run();
}

class Specialized extends Algorithm {
  @Override
  public void run();
}

现在我想测试专门的算法。我真的很想与多个实例/参数并行执行此操作。问题是
run
方法是不可重入的,因此我必须有
专用的
的每个线程实例。当然,任何类型的
AlgorithmRunner
都应该与抽象类
Algorithm
一起工作,以便能够测试多个不同的专门化。问题是我需要构造一个新的
?以通用方式从现有算法扩展算法
。我怎样才能做到这一点?我可以很容易地为每种专门化编写复制构造函数,但这需要使用
instanceof
检查的开关,我宁愿避免这种检查。

有几种方法可以做到这一点。一种是使用
算法
使用抽象工厂方法获取实例:

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,我倾向于让
算法运行程序
算法
分离,并让它接受
算法创建者
或类似工厂方法的实例。

您可以尝试使用:


然后将AlgorithmFactory传递给AlgorithmRunner,允许它在不知道算法实现的情况下实例化算法的子类。

在非抽象类中不能有抽象方法。尽量使您的示例正确,这样我们就可以确定您所说的(例如,抽象类或非抽象方法)是否可以使用
Object.clone()
作为选项?嗯,许多人似乎反对克隆(),我明白他们的观点…可能是克隆的重复
interface AlgorithmFactory {
    public abstract Algorithm createAlgorithm();
}

class SpecializedFactory implements AlgorithmFactory {
    @Override
    public Specialized createAlgorithm() {
        return new Specialized();
    }
}