晚上好,

我正在开发一组Java类,以便容器类Box包含所包含类ListWidget。一个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();

}


因此Widget的子目录可以:

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

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


现在,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;您不能将各种类的那些成员合并为超类中的单个成员。

关于java - Java:在父类(super class)中初始化一个公共(public)静态字段,在每个子类实例中需要一个不同的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2640883/

10-12 17:38