Javaのコマンドラインアプリケーションを作っているのですが、どうしてもnew T()相当を実装したいのですが、回避策はないでしょうか。

親クラス

public abstract class AbstractCommandLineRunner<T extends AbstractCommandLineOption> implements CommandLineRunner {

    protected abstract int execute(T option);

    protected abstract T newOptionInstance();

    public void run(String... args) {
        // ここで本当はT option = new T()として、newOptionInstance()を排除したい
        T option = newOptionInstance();
        new CmdLineParser(option).parseArgument(args);
    }
}

サブクラス

public class HogeRunner extends AbstractCommandLine<HogeOption> {
    // このメソッドの実装を省略したい...
    @Override
    protected HogeOption newOptionInstance() {
        return new HogeOption();
    }

    @Override
    protected int execute(HogeOption option) {
        // blah blah
    }
}

コマンドが増えるたびに下記の手順で、実装するというアーキテクチャにしたいのですが、

  • AbstractCommandLineOptionを継承してコマンド引数を格納するオブジェクトを用意
  • AbstractCommandLineRunnerを継承してexecuteメソッドに処理を実装

CmdLineParserライブラリの都合上、オプションのインスタンスが必要なため、newOptionInstance()というabstractメソッドを定義しています。できればこれを排除して親クラスでインスタンスを作りたいのですが、Javaにおいては困難でしょうか。

  • 開発言語:Java

  • 開発環境:Eclipse

  • フレームワーク:Spring Boot