Java — использование константы в абстрактном классе, которая также должна использоваться подклассами.

У меня есть абстрактный класс и 2 подкласса. Есть 4 константы, которые относятся ко всем классам. Я собирался поместить final в абстрактный класс, но я так понимаю, переменная final не наследуется? Должен ли я определять константу в каждом классе (кажется неэффективным)? Или просто сделать константу мгновенной переменной (не звучит хорошей идеей)?

Какими способами я могу это сделать?


person spaz    schedule 03.05.2012    source источник


Ответы (3)


Следующее будет доступно для всех ваших подклассов, если оно определено в абстрактном классе.

public static final Integer MYCONSTANT = 42;

or

static final Integer MYCONSTANT = 42;

or

protected static final Integer MYCONSTANT = 42;

Второй (package-private) доступен только для классов в одном пакете. Третий (защищенный) будет доступен для всех подклассов независимо от их пакета.

person Martin    schedule 03.05.2012
comment
Я не пробовал, но уверен, что второе выполняется только в том случае, если дочерний класс находится в том же пакете. - person Angelo Fuchs; 03.05.2012
comment
Тогда вы должны написать это так, ОП кажется новичком и может запутаться. - person Angelo Fuchs; 03.05.2012

Константы наследуются потомками. Вам просто нужно убедиться, что они protected или public, чтобы дети могли получить к ним доступ.

abstract class A {
    protected final static String FOO = "bar";
}
class B extends A {
    somemethod() {
        System.out.println("foo: " + FOO);
    }
}

могут быть доступны из класса и всех его потомков.

person Angelo Fuchs    schedule 03.05.2012
comment
Из того, что мне сказали, использование protected - это ленивое программирование, и его не следует использовать. - person spaz; 03.05.2012
comment
@spaz: здесь мы говорим о видимости констант - на самом деле это не наследование. Вы также можете создать класс Constants, пока я видел его во всех своих проектах. Кстати: называть «защищенную» видимость «ленивой» сомнительно... все зависит от ваших потребностей. - person home; 03.05.2012
comment
@spaz, это зависит от контекста. для переменной final, которая должна быть доступна ее собственному классу и его дочерним элементам, это идеальный способ делать вещи. Итак... на самом деле... почему бит должен быть "ленивым" программированием? И что вместо этого использовать? - person Angelo Fuchs; 03.05.2012
comment
@home Да, но если ваши константы class не делают ничего, кроме хранения констант, было бы еще лучше сделать его interface (и да, интерфейсы констант великолепны!) - person Angelo Fuchs; 03.05.2012
comment
Эй, я слышу тебя. Спасибо за ваш вклад! - person spaz; 03.05.2012
comment
@Angelo: я согласен, проблема, с которой я столкнулся с «постоянными интерфейсами», заключается в том, что люди начинают создавать классы, такие как class X implements Constant (я тоже так делал). Я переключился на окончательные классы с закрытым конструктором, определяющим эти константы - поверьте мне, это лучше :-) - person home; 03.05.2012
comment
@spaz Если один из ответов решил вашу проблему, отметьте его как правильный (крючок слева от ответов). - person Angelo Fuchs; 03.05.2012
comment
@home Если кто-то из моей команды сделает это, я накричу на него и удалю это. Плохой код не является оправданием. - person Angelo Fuchs; 03.05.2012
comment
@Angelo: Опять же, я согласен, но я был в ситуациях, когда мне приходилось брать на себя код, и я внезапно обнаруживал +50 классов, реализующих интерфейс Constants ... поэтому я передумал. - person home; 03.05.2012
comment
@Анджело: +1; блин, опять вынужден согласиться :-) - person home; 03.05.2012
comment
Константный класс или интерфейс обычно являются анти-шаблоном. Константы принадлежат своему контексту, который в данном случае является базовым классом. - person Robin; 03.05.2012
comment
Добавление дополнительных деталей к тому, что упомянул @Robin, Обсуждение констант в интерфейсе и статического импорта - person Abhijeet; 12.11.2015

Да. Но поскольку они постоянны, это должно быть final and static, static modifier, чтобы была только одна «копия», и если она будет использоваться только в подклассе, тогда вы можете использовать protected или, если из других классов, также необходимо сделать это public.

person Subhrajyoti Majumder    schedule 03.05.2012