复制构造函数和继承

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,我倾向于将 AlgorithmRunnerAlgorithm 分开,并让它接受 AlgorithmCreator 或类似工厂方法的实例。

您可以尝试使用 Factory pattern:

interface AlgorithmFactory {
    public abstract Algorithm createAlgorithm();
}

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

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