2011-02-07 16 views
0

Java:動的に参照されるクラスの静的プロパティにアクセスするには? は、私は簡単な例を与えている:私は単に動的、静的プロパティのクラスを参照したいJava:動的に参照されるクラスの静的プロパティにアクセスするには?

AppleTree.areTheyAllGrown=true; 

「をareTheyAllGrown」この静的プロパティはAppleTreeのメンバーになることができたり、他のクラスのメンバーである可能性があるのcourceは同じ名前付き静的プロパティ 'areTheyAllGrown'も持ちます。

CherryTree、ApricotTreeなどの他の多くのツリータイプが必要なアプリケーションロジックであれば、AppleTreeの 'areTheyAllGrown'を設定することで、TreeBehaviourインターフェイスが十分でないということを意味します。マークは、私のAppleTreeのインスタンスだけで、すべてのTreeインスタンスではありません。見る?

あなたはこう言っています:AppleTreeImplインターフェイスを作ってそこにプロパティを置くと...それは、インターフェイスの地獄を強制し、1つのプロパティに対してのみ作成する... Implの異なるツリータイプのインターフェイスですか?もっと短い解決策はありませんか?

もちろん私はすべてのものを実装し、クラスへの動的参照の必要性を回避するために多くの他の方法を見ていますが、私はこのメソッドで特にそれを行うことができます。また、インターフェイスや追加のヘルパークラス、Treeクラス以外のパブリックプロパティの過剰な使用もありません。

+0

は(。誰もが反射を示唆している場合、私は非常にクロスしなければならない) –

+1

まあ、反射は、彼が説明したものを行うための唯一の方法です。確かに他のことをすることは良い考えです。私は 'Map 、Boolean> '(実際にはSet)を拡張します。 – maaartinus

+0

@トムハハ、非常に面白い。このようなシナリオでは、他に何を提案しますか? –

答えて

0

まあ、反射は彼が記述したことを行う唯一の方法です。確かに他のことをすることは良い考えです。 Map、Boolean>(実際にはSet)を提案したいと思います。

- maaartinusで19分前

+0

あなたは2日間で自分の回答を受け入れることができます。 – PatlaDJ

6

私はこれをクラスの外に置くことをお勧めします。別のクラスGrowingRegistryでは、マップを持つことができます - Map<Class, Boolean>。そして、あなたは行うことができます。

GrowingRegistry.setAllGrown(AppleTree.class, true); 

はさらに良いことに、あなたは、例えばgetTreeType()を定義するインタフェースTreeを実装し、TreeTypeが列挙型であるマップMap<TreeType, Boolean>を持つことができます。だから、:

GrowingRegistry.setAllGrown(TreeType.APPLE, true); 

さらに拡張するには、「庭」のためのすべてのプロパティを保持しているGardenPropertiesオブジェクトを持つことができます。

私が園について言及したように、すべての問題は、インスタンス化されたすべてのオブジェクトを追跡したいという事実から来ています。そして、それをインスタンス化するのはあなたですか?つまり、すべてのインスタンスをコレクションに入れることができます。たとえば:

Garden garden = new Garden(); 
garden.add(new AppleTreeImpl()); 
garden.add(new CherryTreeImpl()); 

がありますListまたはMap内のインスタンスを格納することができ、また、すべてのプロパティの所有者のための庭を使用しています。

+0

Skapi Bozho、私は同じようにいくつかの解決策を見つけました。しかし、私はそれらに満足していない。彼らは何とかエレガントではありません。見る? setAllGrownのような他の多くのプロパティを持つことができます。しかしこれにも解決策があります。私の質問の答えは今、上記のコメントとして含まれています: 'まあ、反射は彼が描いたことをする唯一の方法です。' maartinus。あなたの答えをありがとう。 – PatlaDJ

+0

@PatlaDJ階層内のクラスごと(インスタンス単位ではなく)のプロパティセットが必要だと正しく理解していますか?オブジェクト指向の問題については、反映は最後の手段と考えるべきであることに注意してください。私は、OOの問題に関しては、ほとんど反映が必要ないと考えています。 – Bozho

+0

"階層内のクラスごと(インスタンス単位ではなく)のプロパティセットが必要であることを正しく理解していますか? ---これは私が欲しいものです。そして私はそれらのインスタンスだけでなく、共通の外部クラスから参照されるようにしたい。クラスの静的プロパティを動的に参照する唯一の方法はjava.lang.reflectionであることを知った後、私は提案したように外部レジストリクラスによってこの階層を実装する予定です。 – PatlaDJ

0

オブジェクトを持っている場合、あなたはちょうどあなたが直接オブジェクトに提案されたものを行うことができます。

あなたがクラスにあなたを持っている場合はでし利用の反射:

try { 
    treeClass.getField("areTheyAllGrown").set(treeClass, true); 
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { 
    // Do whatever you want with the error 
    // e.g.: e.printStackTrace(); 
    // Or you could add a throws declaration 
}; 
関連する問題