Я разрабатываю набор классов Java, так что контейнер класса Box
содержит List
из содержимого класса Widget
, A 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();
}
так sublcasses из 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
.
Итак: как создать в классе родительского Widget
статический WidgetID
, обеспечивая при этом он отличается для каждого экземпляра Widget
и подклассов Widget
? Или я использую неправильный инструмент для работы здесь?
Спасибо!
[Изменить] Я бы предпочел не требовать от пользователей библиотеки для вызова super()
во всех своих конструкторах sub.
Возможно ли, что WidgetID идентифицирует экземпляр виджета или подкласс Widgets? То есть вам нужно отличить RedWidgets? – meriton
Нет; предполагается, что (фактически, написано так, что) «Коробка» будет содержать только один экземпляр каждого подкласса «Виджет». Возможно, я должен был бы назвать его «Эксклюзивный бокс».:) 'WidgetID' будет идентифицировать только подкласс' Widget'. –