【发布时间】:2010-04-14 20:42:50
【问题描述】:
晚上好,
我正在开发一组 Java 类,以便容器类 Box 包含包含类 Widget 的 List。 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 的子类的每个实例似乎都会为它们的Subclassname.WIDGETID 获得相同的static final WidgetID。但是,将其设为非静态意味着我什至不能再调用 Subclassname.WIDGETID。
那么:如何在父类Widget 中创建静态WidgetID,同时确保Widget 的每个实例和Widget 的子类都不同?还是我在这里使用了错误的工具?
谢谢!
[编辑] 我不希望库的用户在所有子Widget 构造函数中调用super()。
【问题讨论】:
-
WidgetID 是用来标识 Widget 的实例还是 Widget 的子类?也就是需要区分RedWidgets吗?
-
否;假设(实际上是这样写的)
Box将只包含Widget的每个子类的单个实例。也许我应该叫它ExclusiveBox。 :)WidgetID将仅标识Widget的子类。
标签: java static initialization subclass final