2010-04-14 18 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