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

时间:2010-04-14 20:42:51

标签: java static initialization subclass final

晚上好,

我正在开发一组Java类,以便容器类Box包含List包含的类WidgetWidget需要能够指定与其他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();

}

所以Widget的sublcasses可以:

public class BlueWidget extends Widget {
    public static final WidgetID WIDGETID = new WidgetID();

    @Override
    public WidgetID getWidgetID() {
        return WIDGETID;
    }
}

现在,BlueWidget可以getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETIDBox可以遍历它的列表,将第二个参数与iter.next().getWidgetID()进行比较。

现在,到目前为止,这一切都很有效。我要做的是不必在所有子类中声明public static final WidgetID WIDGETID,而是在父Widget类中实现它。问题是,如果我将这行代码移到Widget(以及getWidgetID()的实现),那么Widget的子类的每个实例看起来都是相同的{{1他们的static final WidgetID。但是,将其设置为非静态意味着我甚至无法再拨打Subclassname.WIDGETID

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

谢谢!

[编辑]我不希望要求图书馆的用户在其所有子Widget构造函数中调用super()

3 个答案:

答案 0 :(得分:5)

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

所以你在getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID)所做的事情,你可以改为getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class)

答案 1 :(得分:4)

如果每个子类具有不同的值,则该变量不是超类的成员。

换句话说,是的,每个子类都应声明自己的WIDGETID;您不能将各类的成员合并为超类中的单个成员。

答案 2 :(得分:0)

为什么不在Widget中声明一个抽象方法,例如:

protected abstract WidgetID getWidgetID();

这样,每个子类都必须实现该方法并返回自己的值。你仍然可以声明WidgetID在子类中是静态的,但是上面的实例方法返回'unique'值。