2012-02-25 10 views
3

私はJavaアプリケーションを開発中です。これは、抽象クラスのModelと2つの派生クラスModel 1とModel 2です。Model1とModel2の動作が異なりますので、ユーザーが2つのモデルからモデルを選択できるようにします。今、これに伴う問題は、私は新しいクラスのMODEL3を追加した場合、私はコードを書き換える必要があること、であるJava、クラスタイプのリスト

Model model; 
If(response==1){ 
    model = new Model1(); 
}else if(response==2){ 
    model = new Model2(); 
} 

: 次のように実装することができます。 リストを作成して、各クラスのインスタンスを追加した後、クラスの新しいインスタンスを返す静的メソッドを追加しましたが、それ以上のスタイルで少しでもできることを願っています。

各クラスのタイプを保持するために、リストを作成することは可能ですか?このリストから、モデルを選択するためのメニューを作成し、そのタイプを使用してユーザーが必要とするクラスを作成することができます。

したがって、List<Class>を作成してから、クラスオブジェクトをコンストラクタとして使用して、指定されたクラスのインスタンスを作成することは可能ですか?あなたはそれが公共の引数なしのコンストラクタを持っていることを確信している場合

答えて

4

あなたはsuppliersのリストを作成することができます:あなたが反射して周りにマックができ

static final List<Supplier<Model>> MODEL_MAKERS = ImmutableList.of(
    new Supplier<Model>() { public Model get() { return new Model1(); } }, 
    new Supplier<Model>() { public Model get() { return new Model2(); } }, 
    new Supplier<Model>() { public Model get() { return new Model3(); } } 
); 

、それは、Javaの通常の例外処理メカニズムの外にステッピング必要で、どのようにコードを制限し、ゼロ引数publicコンストラクタとpublicクラスが必要ですjavacでチェックされていない方法でメンテナンスのもとで変更することができ、この場合は必要ありません。

+0

+1は反射を使用しないためです。時には、コンパイル時にクラスを知らないのであれば、例えば –

+0

@StevenSchlanskerのように、リフレクションの用途があることに同意する必要があります。私はそれをJavaオブジェクトシステムと他のシステム(ファイルシステム、ORM、組み込みスクリプト言語)の境界に限定することを好みます。 Java内で完全に作業している場合は、メンテナがコードをリファクタリングしたり、プログラムの流れに従うなどの機能に影響を与えない、より良い使い方がしばしばあります。 –

1

、あなたはClass.getConstructor(s)Constructorオブジェクトを見つけることができ、より複雑な用途のためにClass.newInstance()

を使用し、そのように呼び出すことができます。

これを取得したら、ClassMapなどに貼り付けて検索してインスタンスを作成するのは比較的簡単です。

+0

'newInstance'は使用しないでください。 [javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance%28%29)は、次のように明示的に警告しています。「このメソッドは、チェックされた例外を含むnullaryコンストラクタこのメソッドを使用すると、コンパイラによって実行されるコンパイル時の例外チェックが効果的にバイパスされます。 –

+0

場合によっては、これがまさにあなたが望むものです。それは間違いなく注目に値する。 –

0

はい、クラスのnewInstance()メソッドを使用して1つを構築できます。しかし、引数なしのコンストラクタが必要です。

+0

'newInstance'を使用しないでください。 [javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance%28%29)は、次のように明示的に警告しています。「このメソッドは、チェックされた例外を含むnullaryコンストラクタこのメソッドを使用すると、コンパイラによって実行されるコンパイル時の例外チェックが効果的にバイパスされます。 –

+0

コンストラクタが例外をスローしないと確信していれば問題ありません。例外をスローするようなことを一度も呼び出さなかった場合は、決してコーディングを行うことはありません:...-) –

+0

コンストラクタが例外をスローしないようにしていればいいですね。 –

関連する問題