おそらく隠された質問は、階層構造を持つキーにどの構造を使用するかということでしょう(クラスと内部クラス特定のサブセットに対するテストが可能であること)。適切な場所に新しいキーを追加し、適切なkeySetでこのキーを自動で使用できる構造を探しています。ここで私の実際の試行: 私は静的な最終的な文字列と対応するkeySetとしてキーで動作します。 あるキーが他のクラスで宣言されているキーのセット(public static final String)に含まれているかどうかをテストする必要があることがよくあります。 したがって、キーのセットを与えるkeySet()メソッドを持つKeys1クラスのキーを持つすべてのクラスを拡張します。それはうまく動作します。クラスとその内部クラスで宣言されたすべての文字列定数を単一のキーセットに入れる方法
public class Keys1
{
private TreeSet<String> m_keySet = new TreeSet<String>();
public Keys1()
{
initKeySet();
}
private void initKeySet()
{
Field[] felder = this.getClass().getFields();
for (Field f : felder)
{
if (Modifier.isFinal(f.getModifiers()))
{
try
{
if (f.get(f) instanceof String)
{
m_keySet.add(f.get(f).toString());
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
public TreeSet<String> keySet()
{
return m_keySet;
}
}
今私はキーセットもタイプKeys2の内部クラスで宣言されているキーが含まれている必要があり、クラスKeys2で同様の機能をコーディングするために無駄にしてみてください。
public class Keys2 extends Keys1
{
@Override
protected void initKeySet()
{
super.initKeySet();
Class<?>[] innerClasses = this.getClass().getDeclaredClasses();
for (Class<?> innerClass : innerClasses)
{
if (innerClass.getClass().isInstance(Keys1.class))
{
Keys1 newKeys;
try
{
newKeys = (Keys1) innerClass.newInstance(); // Doesn't work
keySet().addAll(newKeys.keySet());
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
}
}
}
"よくテストする必要があります..."多分、それが何か起きているのであれば、あなたのデザインに取り組むべきでしょうか? – Kayaman
ああ... [XY問題](http://xyproblem.info/)の刺激的な香り – shmosel
'f.get(f)'は明らかに間違っています。あなたは 'java.lang.reflect.Field'クラスのフィールドを読んでいません。したがって、静的フィールドでない場合は 'static'フィールドで 'f.get(null)'を使用するか、 'f.get(this) 'を使用するかをチェックします。 – Holger