代码之家  ›  专栏  ›  技术社区  ›  Michelle Tilley

Java:在超类中初始化一个公共静态字段,在每个子类实例中需要不同的值

  •  2
  • Michelle Tilley  · 技术社区  · 14 年前

    晚上好,

    我正在开发一组Java类,以便容器类 Box 包含一个 List 包含类的 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();
    
    }
    

    所以 小装置 可以:

    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 盒子 可以遍历它的列表,将第二个参数与 iter.next().getWidgetID() .

    到目前为止,这一切都很好。我要做的是不必申报 public static final WidgetID WIDGETID 在所有子类中,并在父类中实现它 小装置 班级。问题是,如果我把那行代码移到 小装置 (随着 getWidgetID() ,则 小装置 似乎也一样 static final WidgetID 为了他们 Subclassname.WIDGETID . 但是,使它非静态意味着我甚至不能再调用 子类名称.widgetid .

    那么:如何创建静态 WidgetID 在父母身上 小装置 类,同时确保每个实例的 小装置 以及 小装置 ?或者我在这里用错工具了?

    谢谢!

    [编辑]我不希望要求图书馆的用户打电话 super() 在他们所有的潜艇里- 小装置 施工人员。

    3 回复  |  直到 14 年前
        1
  •  4
  •   erickson    14 年前

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

    换句话说,是的,每个子类都应该声明自己的widgetid;不能将不同类的成员合并为一个超类中的单个成员。

        2
  •  5
  •   ColinD    14 年前

    既然widgetID对于每个特定的子类都是唯一的,那么为什么不直接用它们的类来标识它们呢?

    所以你在哪里 getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.WIDGETID) 你可以做到 getBox().addWidgetRelationship(RelationshipTypes.SomeType, RedWidget.class) 相反。

        3
  •  0
  •   Jason Nichols    14 年前

    为什么不在小部件中声明一个抽象方法,比如:

    protected abstract WidgetID getWidgetID();
    

    这样,每个子类都必须实现该方法并返回自己的值。您仍然可以在子类中声明widgetid是静态的,但是上面的实例方法返回“unique”值。