あなたは正しいです。コンパイル時に強制することはできません。実行時に実行できるさまざまなトリックがありますが (テストでリフレクションを使用するなど)、それだけです。
しかし、自問してみてください。なぜそれを要求したいのですか? 静的メソッドまたはコンストラクターを動的に呼び出すことはできません (リフレクションを使用する場合を除く)。必要なファクトリがあるとしたら、それらをどのように正確に使用しますか?
コードの一貫性のためだけの場合 (これは良いことです!)、コード ベースを開発するときにその一貫性を確保する必要があります。基本クラスのコメントは、コーディング レビューやその他の "ソフト" テクニックと同様に、ここで大いに役立ちます。
リフレクションでファクトリを使用する場合は、同様のリフレクションをテストで使用して、各サブクラスに必要なビットがあることを確認できます。
もう 1 つのオプションは、非静的ファクトリを作成することです。
public interface FooMaker() {
Foo create(String arg);
}
fromString...静的メソッドではなく、それを使用します。
FooMakerここでも、「すべてのサブクラスに実装があることを確認するにはどうすればよいですか?」という同じ問題があります。繰り返しますが、それについて心配する必要はありません。サブクラスではなく、コードの「開始点」を作成する場合FooMaker、サブクラスが何をしているかは問題ではありません。重要なのは、あなたFooMakerの s が文字列からFoos に行く方法を提供し、それぞれFooが文字列に戻る方法を持っているということです。