2010-04-14 45 views
1

晚上好不同的值,的Java:初始化在超類公共靜態字段,需要在每個子類的實例

我正在開發一組Java類,使容器類Box包含包含的類WidgetList 。 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同時確保它是的WidgetWidget和子類的每一個實例有什麼不同?還是我在這裏使用錯誤的工具來完成這項工作?

謝謝!

[編輯]我不希望圖書館的用戶撥打super()所有的子Widget構造函數。

+1

WidgetID是否應該標識Widget的實例或Widgets的子類?也就是說,你需要區分RedWidgets嗎? – meriton 2010-04-14 21:02:27

+0

否;假設(實際上,寫成這樣)'Box'將只包含'Widget'每個子類的單個實例。也許我應該把它稱爲'ExclusiveBox'。:)'WidgetID'將只識別'Widget'的一個子類。 – 2010-04-14 21:21:44

回答

4

如果每個子類都有不同的值,則該變量不是超類的成員。

換句話說,是的,每個子類都應該聲明自己的WIDGETID;您不能將各類的成員作爲超類中的單個成員進行合併。

+0

由於它回答了所提出的問題而被標記爲正確答案,但其他答案提供了有用的想法。 – 2010-04-15 03:27:06

5

由於它的想法似乎是WidgetID對於每個特定的子類都是唯一的,爲什麼不直接用它們的類來識別它們呢?

所以,你在做什麼getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID)你可以改爲getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class)

+0

我其實很喜歡這種方法;如果Google Web Toolkit支持這一點,那聽起來很理想。你能指定一個方法應該只接受來自'Widget'或其子類的'Class'對象嗎?例如,讓一個人不能傳入'someRandomObject.class'? – 2010-04-14 21:23:51

+2

Binary:是的,將該參數聲明爲Class <?擴展Widget>' – meriton 2010-04-14 21:28:37

0

爲什麼不只是內的Widget聲明一個抽象的方法,如:

protected abstract WidgetID getWidgetID(); 

這樣,每個子類必須實現的方法,並返回其自身的價值。你仍然可以聲明WidgetID在子類中是靜態的,但是上面的實例方法返回'unique'值。

+0

使用該接口,如果您已經擁有該Widget的實例,則只能引用一個Widget。在他的例子中,瞭解班級就夠了。 – meriton 2010-04-14 21:04:46

+0

這個功能(Jason的原始答案)是目前在我的問題中工作的方式。也許這是一個標誌。 :) – 2010-04-14 21:18:20