Java:初始化超类中的公共静态字段,该字段在每个子类实例中需要不同的值
晚上好, 我正在开发一组Java类,以便容器类Java:初始化超类中的公共静态字段,该字段在每个子类实例中需要不同的值,java,static,initialization,subclass,final,Java,Static,Initialization,Subclass,Final,晚上好, 我正在开发一组Java类,以便容器类Box包含所包含类小部件的列表。小部件需要能够指定与其他小部件的关系。我认为这样做的一个好方法是这样做: public abstract class Widget { public static class WidgetID { // implementation stolen from Google's GWT private static int nextHashCode; private
Box
包含所包含类小部件的列表。小部件
需要能够指定与其他小部件
的关系。我认为这样做的一个好方法是这样做:
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()
现在,到目前为止,所有这些都非常有效。我要做的是避免在所有子类中声明公共静态最终WidgetID WidgetID
,而是在父Widget
类中实现它。问题是,如果我将这行代码移动到Widget
(随着getWidgetID()
的实现,Widget
的子类的每个实例对于它们的Subclassname.WidgetID
似乎都会得到相同的静态最终WidgetID
。然而,使其非静态意味着我甚至不能再调用Subclassname.WidgetID
那么:如何在父小部件类中创建静态WidgetID
,同时确保每个小部件实例和小部件的子类都不同?或者我在这里使用了错误的工具
谢谢
[编辑]我不希望要求库用户在其所有子小部件构造函数中调用super()
。如果每个子类都有不同的值,则变量不是超类的成员
换句话说,是的,每个子类都应该声明自己的WIDGETID;您不能将不同类的成员合并为一个超类中的单个成员。因为WIDGETID对于每个特定的子类都是唯一的,为什么不改为通过它们的类来标识它们呢
因此,当您执行getBox().addWidgetRelationship(RelationshipTypes.SomeType,RedWidget.WIDGETID)
时,您可以执行getBox().addWidgetRelationship(RelationshipTypes.SomeType,RedWidget.class)
。为什么不在小部件中声明一个抽象方法,例如:
protected abstract WidgetID getWidgetID();
这样,每个子类都必须实现该方法并返回自己的值。您仍然可以在子类中将WidgetID声明为静态,但上面的实例方法将返回“唯一”值。WidgetID应该标识Widget的实例还是Widget的子类?也就是说,您需要区分RedWidgets吗?不,它是假设(实际上是这样编写的)Box
将只包含Widget
的每个子类的一个实例。也许我应该将其称为ExclusiveBox
:)WidgetID
将只识别Widget
的一个子类。通过该接口,如果您已经有一个Widget实例,则只能引用该Widget。在他的示例中,了解该类就足够了。这个功能(Jason的原始答案)就是我问题中当前的工作方式。也许这是一个标志。:)我其实很喜欢这个方法,;如果GoogleWebToolkit支持这一点,那听起来很理想。您是否可以指定一个方法只接受来自Widget
或其子类的Class
对象?例如,这样就不能传入someRandomObject.class
?Binary:是的,将参数声明为类,标记为正确答案,因为它回答了提出的问题,尽管其他答案提供了有用的想法。