也许隐藏的问题是对于具有某种层次结构的键使用哪种结构(因此我尝试使用类和内部类,以便可以对特定子集进行测试)。我正在寻找一种结构,我可以在其中将新密钥添加到适当的位置,并在适当的 keySet 中自动拥有该密钥。这是我的实际尝试:现在我将键作为静态最终字符串和相应的键集。我经常需要测试某个键是否包含在其他类中声明的键集(公共静态最终字符串)中。因此,我使用 Keys1 类中的键扩展所有类,该类 Keys1 具有提供键集的方法 keySet()。这很好用。
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 类中编写类似的功能,其中 keySet 还应该包含在 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();
}
}
}
}
}