Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:初始化超类中的公共静态字段,该字段在每个子类实例中需要不同的值_Java_Static_Initialization_Subclass_Final - Fatal编程技术网

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

晚上好,

我正在开发一组Java类,以便容器类
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:是的,将参数声明为
类,标记为正确答案,因为它回答了提出的问题,尽管其他答案提供了有用的想法。