Good evening,
I am developing a set of Java classes so that a container class Box
contains a List
of a contained class Widget
. A Widget
needs to be able to specify relationships with other Widgets
. I figured a good way to do this would be to do something like this:
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();
}
so sublcasses of Widget
could:
public class BlueWidget extends Widget {
public static final WidgetID WIDGETID = new WidgetID();
@Override
public WidgetID getWidgetID() {
return WIDGETID;
}
}
Now, BlueWidget
can do getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID
, and Box
can iterate through it's list comparing the second parameter to iter.next().getWidgetID()
.
Now, all this works great so far. What I'm trying to do is keep from having to declare the public static final WidgetID WIDGETID
in all the subclasses and implement it instead in the parent Widget
class. The problem is, if I move that line of code into Widget
(along with the implementation of getWidgetID()
), then every instance of a subclass of Widget
appears to get the same static final WidgetID
for their Subclassname.WIDGETID
. However, making it non-static means I can no longer even call Subclassname.WIDGETID
.
So: how do I create a static WidgetID
in the parent Widget
class while ensuring it is different for every instance of Widget
and subclasses of Widget
? Or am I using the wrong tool for the job here?
Thanks!
[Edit] I would prefer not to require users of the library to call super()
in all their sub-Widget
constructors.