代码之家  ›  专栏  ›  技术社区  ›  Matt Huggins

Java:我可以要求一个子类来定义属性值吗?

  •  4
  • Matt Huggins  · 技术社区  · 15 年前

    我有一个抽象基类,许多类都扩展了它。我希望所有这些类都为最初在基类中定义的特定属性定义一个唯一的值(类似于 serialVersionUID 属性,该属性未在继承自的类中定义时导致警告 Serializable ).

    在我的抽象基类中,有没有一种方法可以声明一个没有值但需要所有扩展类为其定义值的属性?

    请注意,该值不必与每个实例相关联,即:它可以定义为 static .

    编辑: 序列版本ID (就其签名而言)这样我的IDE在没有定义时会发出警告?

    4 回复  |  直到 15 年前
        1
  •  2
  •   CM0491    10 年前

    不能重写字段,但可以重写方法。如果不需要强制该值为常量,请使用:

    class abstract Super() {
        /**
         * @return the magic value
         */
        abstract MyType getValue();
    }
    

    如果您确实需要强制该字段为final,您可以为每个实例提供自己的副本/引用,如Steve或Mike的回答所示。

    如果你不能做到这一点,你也可以做一些疯狂的事情,比如:

    class Super() {
        private static Map<Class<? extends Super, MyType> map = new ...;
    
        protected Super(MyType value) {
            if (!map.contains(getClass())) {
                map.put(getClass(), value);
            } else {
                assert map.get(getClass(), value) == value;
            }
        }
    }
    
        2
  •  1
  •   Nikita Rybak    15 年前

    几乎没有。我建议将用户指令放在基类“javadoc”中,并在使用前检查属性是否存在: object.class.getDeclaredField("MY_CONSTANT")

    我想, Serializable 接口就是这种方法的一个很好的例子。

        3
  •  1
  •   Steve McLeod    15 年前

    以下是一种典型的方法:

    public abstract class Superclass {
    
        private final String something;
    
        public Superclass(String something) {
            this.something = something;
        }
    
        public String getSomething() {
            return something;
        }
    }
    
    public class Subclass {
    
        public Subclass() {
            super("a value for something");
        }
    }
    

    但是,您不需要有静态属性值。

        4
  •  1
  •   Mike    15 年前

    重新发布以符合我错过的标准:

    public abstract class Abstract {
    
        private static int field;
    
        public Abstract(int aValue) {
            field = aValue;
        }
    
        public int getField() {
            return field;
        }
    }
    
    public class Child extends Abstract {
    
        private static final int value;
    
        static {
            value = 10; //Pick a value for each class.
        }
    
        public Child() {
            super(value);
        }
    }
    
    推荐文章