2

晚上好,

我正在开发一组 Java 类,以便一个容器类Box包含一个List包含的类Widget。AWidget需要能够指定与其他的关系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();

}

所以 can 的子类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似乎都static final WidgetID对它们的Subclassname.WIDGETID. 但是,使其成为非静态意味着我什至不能再调用Subclassname.WIDGETID.

那么:我如何WidgetID在父Widget类中创建一个静态,同时确保它的每个实例Widget和子类都不同Widget?还是我在这里使用了错误的工具来完成这项工作?

谢谢!

[编辑] 我不希望库的用户调用super()他们所有的子Widget构造函数。

4

3 回答 3

5

既然这个想法似乎是每个特定子类的 WidgetID 都是唯一的,那么您为什么不直接通过它们的类来识别它们呢?

所以你在做什么,getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID)你可以getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class)代替。

于 2010-04-14T20:57:27.320 回答
4

如果每个子类都有不同的值,则该变量不是超类的成员。

换句话说,是的,每个子类都应该声明自己的 WIDGETID;您不能将各个类的这些成员合并为超类中的单个成员。

于 2010-04-14T20:52:07.393 回答
0

为什么不在 Widget 中声明一个抽象方法,例如:

protected abstract WidgetID getWidgetID();

这样,每个子类都必须实现该方法并返回自己的值。您仍然可以在子类中将 WidgetID 声明为静态,但上述实例方法返回“唯一”值。

于 2010-04-14T20:57:29.463 回答