Java Абстрактные классы хороших практик - PullRequest
0 голосов
/ 13 марта 2020

Я только что узнал об абстрактных классах в Java, и мне было интересно.
Будет ли использование закрытых полей пакета считаться плохой практикой?
Например:

abstract class Parent {
    String testField;

    public void method() {
        System.out.println(testField);
    }
}

Тогда на детский класс, который я бы сделал

public final class Children extends Parent {

    @Override
    public void method() {
        logger.log(testField);
    }

}

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

Ответы [ 4 ]

1 голос
/ 13 марта 2020

В целом (имеется в виду, что исключения допускаются при четко определенных обстоятельствах), поле класса должно быть private, и любой доступ к нему потребует использования метода получения или установки (или, более общего, ' accessor 'или' mutator ').

Одно (общеизвестное) исключение относится к static final полям неизменяемого или примитивного типа - иногда их называют константой .

Когда вы можете быть уверены (действительно уверены), что ваш код является единственным, который получит доступ к этому полю (на данный момент и в обозримом будущем), вы можете рассмотреть возможность сделать его public (редко), package private или protected. Вы найдете этот шаблон довольно часто в классах из пакетов java и javax; он работает там, потому что вы не можете поместить свои новые классы в один из этих пакетов, и поэтому код в вашем классе не может получить доступ к полям package private и protected - и потому что (абстрактные) базовые классы в этих пакетах, которые имеют protected поля сами по себе не public, наследование не помогло бы.

Это не будет работать в большинстве других случаев (хотя с Jigsaw… все меняется), поэтому в этих случаях вы ограничены частными внутренними классами.

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

1 голос
/ 13 марта 2020

Это зависит от того, что вы хотите сделать. Однако во многих случаях инкапсуляция или скрытие информации может быть полезным принципом. В вашем случае это будет означать создание переменной-члена protected или private и выставление ее только через методы получения / установки или не делать это вообще. Это дает некоторые преимущества:

  • Вы можете изменить реализацию своего класса (например, изменив тип testField), не нарушая код других программистов
  • Код более понятен для других программистам, поскольку им нужно только рассмотреть методы c publi
  • Это облегчает тестирование кода
  • Это препятствует зависти и жесткой связи
1 голос
/ 13 марта 2020

Есть много советов. Предпочитаю композицию наследованию. Предпочитаю интерфейсы базовым классам. Держите иерархии типов плоскими. Класс должен быть либо листовым (может быть помечен final), либо абстрактным.

Самая важная практика здесь - избегать protected. Это ошибка в языке. Также избегайте закрытого доступа по умолчанию / пакета для чего-либо, кроме типов верхнего уровня.

0 голосов
/ 13 марта 2020

Мы можем сделать методы защищенными в базовых абстрактных классах так, чтобы их переопределяли только подклассы.

 protected void method() {
    System.out.println(testField);
}
...