Java:在超类中初始化公共静态字段,在每个子类实例中需要不同的值

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 WidgetIDSubclassname.WIDGETID.然而,使它成为非静态意味着我甚至不能再打电话了Subclassname.WIDGETID.

那么:我如何WidgetID在父Widget类中创建静态,同时确保它对于每个实例Widget和子类都不同Widget?或者我在这里使用错误的工具?

谢谢!

[编辑]我不希望要求库的用户调用super()所有子Widget构造函数.

Col*_*inD 5

因为看起来WidgetID对于每个特定的子类都是唯一的,所以为什么不用它们的类来识别它们呢?

所以,你在做什么,getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID)你可以做getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class).

  • 二进制:是的,将参数声明为`Class <?扩展Widget>` (2认同)