3

名前が A、B、C、...X、Y、Z の約 20 個のクラスを取得します。

そして、ユーザーが私にメッセージを送信します。メッセージの内容に応じて、インスタンス化するクラスの 1 つを選択します。メッセージは、対応するクラスの名前と同じです。

これを行うには、switch case ステートメントを次のように記述できます。

switch (msg):
  case "A" :
    class = new A();
    break;
  case "B" :
    class = new B();
    break;
  case "C" :
    class = new C();
    break;
...

それを行うためのより簡潔な方法はありますか?1000クラスを取得した場合、コーディングがどれほど退屈になるか想像できません。

4

6 に答える 6

3

これに使用できますClass.forName()

Class c = Class.forName("foo.bar.MyClass"); // requires full class name including package
Object object = c.newInstance();

詳細については、のドキュメントを参照Class.forName()してください。これらの機能は反射と呼ばれます。Oracle は、これらの種類の機能について優れたドキュメント セクションを提供しています。

于 2013-09-02T20:03:54.130 に答える
0
  1. Classからインスタンスを取得し、ClassLoader必要な名前を渡します。
  2. それを呼び出しnewInstanceます。
于 2013-09-02T20:03:53.277 に答える
0

まず、この種の問題は優れた設計にはつきものです。あなたが話している方法の種類はFactroy Methodです。

ケースを使用できますが、通常は if-else ブロックを使用します。そう...

if(msg.equals(A)) {
  return new A();
} else if(msg.equals(B)) {
  return new B();
} ....

ここで A と B が文字列であると仮定すると、定数 ( ) として定義するのが好きpublic static finalです。

どちらも少し面倒ですが、ほとんどの場合、より標準的な手順である if-else ブロックを使用します。

于 2013-09-02T20:12:02.357 に答える