晚上好不同的值,的Java:初始化在超类公共静态字段,需要在每个子类的实例
我正在开发一组Java类,使容器类Box
包含包含的类Widget
的List
。 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();
}
所以sublcasses 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
的子类的每个实例对于它们的Subclassname.WIDGETID
看起来获得相同的static final WidgetID
。但是,使它变为非静态意味着我再也不能拨打Subclassname.WIDGETID
。
所以:我怎么创建父Widget
类的静态WidgetID
同时确保它是的Widget
Widget
和子类的每一个实例有什么不同?还是我在这里使用错误的工具来完成这项工作?
谢谢!
[编辑]我不希望图书馆的用户拨打super()
所有的子Widget
构造函数。
WidgetID是否应该标识Widget的实例或Widgets的子类?也就是说,你需要区分RedWidgets吗? – meriton 2010-04-14 21:02:27
否;假设(实际上,写成这样)'Box'将只包含'Widget'每个子类的单个实例。也许我应该把它称为'ExclusiveBox'。:)'WidgetID'将只识别'Widget'的一个子类。 – 2010-04-14 21:21:44