晚上好不同的值,的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