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は、そんなに簡単です。
私はちょうど新しい列挙型フィールドを作成することができ、残りは私のために行われます。
しかし、この方法は良いですか?それは効率的ですか?それは遅いですか?あるいは危険ですか?
反射を回避する方法はあり列挙型は安全ですと言うだろうか?私は、列挙フィールドのフィールド(用語の不足のため)は、TestClass.classの代わりにnew TestClass()、その後newInstanceを後で行うようにしようとしましたが、すべての人のTestClassは同じで...インスタンス化されません。 – user7148508
複数のインスタンスが必要な場合は、 'new'を複数回呼び出す必要があります。列挙型と同じように 'attribute'ハッシュマップを直接ビルドすることができます –
デフォルトのjavaメソッドがありますか?new TestClass()。newInstance();代わりにTestClass.class.newInstance();を使用する代わりに、必要はありません – user7148508