Mic*_*ley 2 java static final initialization subclass
晚上好,
我正在开发一组Java类,以便容器类Box包含List一个包含的类Widget.A Widget需要能够指定与其他人的关系Widgets.我认为这样做的好方法是做这样的事情:
public abstract class Widget {
public static class WidgetID {
// implementation stolen from Google's GWT
private static int nextHashCode;
private final int index;
public WidgetID() {
index = ++nextHashCode;
}
public final int hashCode() {
return index;
}
}
public abstract WidgetID getWidgetID();
}
Run Code Online (Sandbox Code Playgroud)
所以sublcasses Widget可以:
public class BlueWidget extends Widget {
public static final WidgetID WIDGETID = new WidgetID();
@Override
public WidgetID getWidgetID() {
return WIDGETID;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,BlueWidget可以做getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID,并Box可以迭代它的列表比较第二个参数iter.next().getWidgetID().
现在,到目前为止,这一切都很有效.我要做的是不必public static final WidgetID WIDGETID在所有子类中声明并在父Widget类中实现它.问题是,如果我将这行代码移入Widget(与实现一起getWidgetID()),那么子类的每个实例Widget看起来都是相同static final WidgetID的Subclassname.WIDGETID.然而,使它成为非静态意味着我甚至不能再打电话了Subclassname.WIDGETID.
那么:我如何WidgetID在父Widget类中创建静态,同时确保它对于每个实例Widget和子类都不同Widget?或者我在这里使用错误的工具?
谢谢!
[编辑]我不希望要求库的用户调用super()所有子Widget构造函数.
因为看起来WidgetID对于每个特定的子类都是唯一的,所以为什么不用它们的类来识别它们呢?
所以,你在做什么,getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID)你可以做getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class).