Java: могу ли я требовать дочерний класс для определения значения свойства? - PullRequest
4 голосов
/ 11 августа 2010

У меня есть абстрактный базовый класс, который расширяют многие классы.Мне бы хотелось, чтобы все эти классы определяли уникальное значение для конкретного свойства, которое изначально определено в базовом классе (аналогично свойству serialVersionUID, которое вызывает предупреждение, если оно не определено в классах, которые наследуются от Serializable).

В моем абстрактном базовом классе есть способ объявить свойство, которое не имеет значения, но требует, чтобы все расширенные классы определяли его значение?

Обратите внимание, чтозначение не обязательно должно быть связано с каждым отдельным экземпляром, то есть: оно может быть определено как static.

Редактировать: Я предполагаю, что мне также следует задать более простой вопрос, посколькуответы варьируются настолько широко, как Java реализует serialVersionUID (с точки зрения своей подписи) так, что моя среда IDE выдает предупреждения, когда она не определена?

Ответы [ 4 ]

2 голосов
/ 11 августа 2010

Поля не могут быть переопределены, но методы могут. Если вам не нужно указывать постоянное значение, используйте:

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

Если вам нужно убедиться, что поле является окончательным, вы можете дать каждому экземпляру собственную копию / ссылку, как в ответах Стива или Майка.

Если вы не можете этого сделать, вы можете делать такие сумасшедшие вещи, как:

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;
        }
    }
}
1 голос
/ 11 августа 2010

Перепост, чтобы соответствовать критериям, которые я пропустил:

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);
    }
}
1 голос
/ 11 августа 2010

Едва ли.Я бы посоветовал поместить инструкции пользователя в javadoc вашего базового класса и проверить, присутствует ли свойство перед его использованием: object.class.getDeclaredField("MY_CONSTANT")

Я думаю, Serializable интерфейс - хороший пример такого подхода.

0 голосов
/ 11 августа 2010

Типичным подходом к этому является примерно следующее:

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");
    }
}

Вы не можете получить статическое значение свойства.

...