Java — защищенные геттеры и вложенные классы

Если у меня есть куча полей в родительском классе, которые все должны быть унаследованы подклассами, лучше ли вложить подклассы в суперкласс, сделать поля защищенными, а не закрытыми, или использовать защищенные методы доступа? Или какая-то другая альтернатива?


person false_azure    schedule 09.04.2013    source источник
comment
Поскольку это сильно зависит от вашего варианта использования, не могли бы вы рассказать об этом немного подробнее?   -  person Simon Hellinger    schedule 09.04.2013
comment
У меня есть суперкласс (Сотрудник), который содержит много данных, общих для его подклассов (типов сотрудников), а также некоторые методы расчета заработной платы/налогов (абстрактные и конкретные). Подклассы выполняют множество вычислений, требующих данных из полей суперкласса. Доступ к очень немногим полям требуется вне этого семейства классов.   -  person false_azure    schedule 09.04.2013


Ответы (5)


Самое простое решение - сделать поля суперкласса или переменные экземпляра защищенными, однако, если вы сделаете их закрытыми, вы всегда сможете получить к ним доступ через геттеры и сеттеры, что концептуально намного лучше, поскольку придерживается принципа инкапсуляции.

person blackpanther    schedule 09.04.2013

Казалось бы, самое простое решение — сделать поля защищенными, если у вас нет веских причин поступать иначе, просто сделайте это.

person codebox    schedule 09.04.2013

Я думаю, что использование защищенных методов доступа является лучшим и более распространенным подходом.

person Ugur Artun    schedule 09.04.2013

Есть случаи, когда раскрытие защищенных полей или защищенных методов доступа имеет смысл. Так что все зависит от вашего дизайна для родительского класса и от того, как вы хотите, чтобы дочерний класс использовал ваш родительский класс.

Тем не менее, это точно: «лучше ли иметь подклассы, вложенные в суперкласс» ‹- это редко правильный выбор.

person Adrian Shum    schedule 09.04.2013

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

               Access Levels

Modifier    Class   Package Subclass    World
public      Y       Y       Y           Y
protected   Y       Y       Y           N
no modifier Y       Y       N           N
private     Y       N       N           N

Если вы вкладываете подкласс в суперкласс, вы также можете использовать частный. Это связано с тем, что внутренний класс является ЧАСТЬЮ родительского класса и, следовательно, также имеет доступ к закрытым методам.

public class Parent {
    private int x = 5;

    //Not really a subclass
    private class NestedClass {
        public NestedClass() {
            int hax = new Parent().x; // Works!
        }
    }

    //More of a nestedclass than a subclass.
    private class SubClass extends Parent {
        public SubClass() {
            int stillHax = new Parent().x;
        }
    }
}

Вы не используете наследование, пока не используете ключевые слова extends или implements, поэтому вы, вероятно, захотите, чтобы подкласс расширял родительский класс (в другом файле), а переменные имели доступ к защищенному (или общедоступному) уровню. Обратите внимание, что нахождение в одном пакете или в одном классе имеет приоритет в сетке. Приведенные выше два примера работают, потому что другой класс находится в ТОМ ЖЕ классе, что и родительский класс.

Просто следуйте сетке, вот и все.

person Sanchit    schedule 09.04.2013