おそらく、隠れた問題は、ある種の階層を持つキーにどの構造を使用するかということです (したがって、特定のサブセットのテストが可能になるように、クラスと内部クラスを使用しようとしています)。新しいキーを適切な場所に追加し、このキーを適切なキーセットに自動的に配置できる構造を探しています。ここで私の実際の試み:今、静的な最終的な文字列と対応するキーセットとしてキーを操作します。特定のキーが他のクラスで宣言されたキーのセット (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;
}
}
ここで、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();
}
}
}
}
}