2017-03-04 18 views
0

Javaを学ぶプロジェクトをダウンロードしました。大きなコードブロックを変更する興味深い方法が見つかりました。
私はまだJavaに新しいので、私がやったことがより効率的で危険なのかどうかわかりません。
構文1は前に、構文2は私の方法です。列挙型とリフレクションを使用してクラスリストのメソッドを呼び出す

構文1:構文2

class Person{ 

    TestClass testClass; 
    TestClass2 testClass2; 
    //etc... 

    public Person(){ 
     testClass = new TestClass(); 
     testClass2 = new TestClass2(); 
     //etc... 
    } 

    void init(){ 
     testClass.init(); 
     testClass2.init(); 
     //etc... 
    } 



} 

代わりに行う:

person.testclass.doThing(); 

この方法は、オブジェクトと用途としてハッシュマップ格納クラスを使用キーとしての列挙型。

TestClass tc = (TestClass) person.attribute.get(EnumKey.TEST_CLASS); 
tc.doThing(); 

class Person{ 

    public HashMap<EnumKey, Object> attribute; 

    public Person(){ 
     Class2.sendTasks(this); //sends all classes 
    } 

    void init(){ 
     class2.initTasks(this); //inits all 
    } 



} 

class Class2{ 

    void sendTasks(Person p) 
     for (EnumKey ek : EnumKey.values(){ 
      try { 
       p.attribute.put(ek, ek.handshakeClass.newInstance(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    void initTasks(Person p){ 
     for (EnumKey ek : EnumKey.values(){ 
      (TaskClass) tc = p.attribute.get(ek); //NOTE: all stored values (testclass1,2,3,etc) implement the interface TaskClass... 
      tc.init(); 
     } 
    } 

} 

。私は新しいクラスを作成するたびにTaskClassのすべての抽象メソッドを入力する必要はありませんよう

enum EnumKey{ 

    TEST_CLASS(TestClass.class), 

    TEST_CLASS2(TestClass2.class); 


    Class<?> handshakeClass; 
    EnumKey(Class<?> handshakeClass){ 
     this.handshakeClass = handshakeClass; 

    } 
} 

構文2は、そんなに簡単です。
私はちょうど新しい列挙型フィールドを作成することができ、残りは私のために行われます。

しかし、この方法は良いですか?それは効率的ですか?それは遅いですか?あるいは危険ですか?

答えて

1

効率的ですか?遅いですか?

「リフレクション」を使用しているので、ある程度のオーバーヘッドがあります。

別の可能性はすぐに

HashMap<Integer, Object> attribute = new HashMap<>() {{ 
    put(0, new TestClass()); 
    put(1, new TestClass1()) ; 
}}; 

をHashMapを構築することですこれは良い方法ですか?

これは本当にあなたが何をする必要があるかによって異なりますが、類似したクラスのリストを繰り返して、他のオブジェクトを動的に更新するための最短方法です。

さらに、インターフェイスと抽象クラスを使用して拡張することができます。

risky?

これはわかりません。

はあなたのクラスパス内のすべてのファイルを反復処理のような列挙型せずに持って何をすべきか、他の方法がありますが、私は

+0

反射を回避する方法はあり列挙型は安全ですと言うだろうか?私は、列挙フィールドのフィールド(用語の不足のため)は、TestClass.classの代わりにnew TestClass()、その後newInstanceを後で行うようにしようとしましたが、すべての人のTestClassは同じで...インスタンス化されません。 – user7148508

+0

複数のインスタンスが必要な場合は、 'new'を複数回呼び出す必要があります。列挙型と同じように 'attribute'ハッシュマップを直接ビルドすることができます –

+0

デフォルトのjavaメソッドがありますか?new TestClass()。newInstance();代わりにTestClass.class.newInstance();を使用する代わりに、必要はありません – user7148508

関連する問題