Если у меня есть куча полей в родительском классе, которые все должны быть унаследованы подклассами, лучше ли вложить подклассы в суперкласс, сделать поля защищенными, а не закрытыми, или использовать защищенные методы доступа? Или какая-то другая альтернатива?
Java — защищенные геттеры и вложенные классы
Ответы (5)
Самое простое решение - сделать поля суперкласса или переменные экземпляра защищенными, однако, если вы сделаете их закрытыми, вы всегда сможете получить к ним доступ через геттеры и сеттеры, что концептуально намного лучше, поскольку придерживается принципа инкапсуляции.
Казалось бы, самое простое решение — сделать поля защищенными, если у вас нет веских причин поступать иначе, просто сделайте это.
Я думаю, что использование защищенных методов доступа является лучшим и более распространенным подходом.
Есть случаи, когда раскрытие защищенных полей или защищенных методов доступа имеет смысл. Так что все зависит от вашего дизайна для родительского класса и от того, как вы хотите, чтобы дочерний класс использовал ваш родительский класс.
Тем не менее, это точно: «лучше ли иметь подклассы, вложенные в суперкласс» ‹- это редко правильный выбор.
Если вы хотите, чтобы он был доступен для подкласса, у вас остается только два варианта: общедоступный и защищенный. Защищено, вероятно, то, что вы хотите. Приведенная ниже таблица применяется, когда вы используете ключевое слово 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, поэтому вы, вероятно, захотите, чтобы подкласс расширял родительский класс (в другом файле), а переменные имели доступ к защищенному (или общедоступному) уровню. Обратите внимание, что нахождение в одном пакете или в одном классе имеет приоритет в сетке. Приведенные выше два примера работают, потому что другой класс находится в ТОМ ЖЕ классе, что и родительский класс.
Просто следуйте сетке, вот и все.