晚上好,
我正在开发一组Java类,以便容器类Box
包含List
包含的类Widget
。 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();
}
所以Widget
的sublcasses可以:
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
的子类的每个实例看起来都是相同的{{1他们的static final WidgetID
。但是,将其设置为非静态意味着我甚至无法再拨打Subclassname.WIDGETID
。
那么:如何在父Subclassname.WIDGETID
类中创建静态WidgetID
,同时确保Widget
的每个实例和Widget
的子类都不同?或者我在这里使用错误的工具吗?
谢谢!
[编辑]我不希望要求图书馆的用户在其所有子Widget
构造函数中调用super()
。
答案 0 :(得分:5)
因为看起来WidgetID对于每个特定的子类都是唯一的,所以为什么不用它们来代替它们呢?
所以你在getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID)
所做的事情,你可以改为getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class)
。
答案 1 :(得分:4)
如果每个子类具有不同的值,则该变量不是超类的成员。
换句话说,是的,每个子类都应声明自己的WIDGETID;您不能将各类的成员合并为超类中的单个成员。
答案 2 :(得分:0)
为什么不在Widget中声明一个抽象方法,例如:
protected abstract WidgetID getWidgetID();
这样,每个子类都必须实现该方法并返回自己的值。你仍然可以声明WidgetID在子类中是静态的,但是上面的实例方法返回'unique'值。