Java - абстрактный класс для хранения переменных? - PullRequest
23 голосов
/ 25 октября 2008

Является ли хорошей практикой разрешать абстрактным классам определять переменные экземпляра?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

Затем подкласс ExternalJavaScript.class автоматически получит исходную переменную, но я чувствую, что легче читать код, если все подклассы сами определяют источник, а не наследование.

Какой ваш совет?

/ Adam

Ответы [ 3 ]

31 голосов
/ 25 октября 2008

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

public abstract class ExternalScript extends Script {

private String source;

public void setSource(String file) {
    source = file;
}

public String getSource() {
    return source;
}

Возвращаясь к этому вопросу, вы когда-нибудь задумывались о том, где находится код получения / установки при его чтении? Если они все получают и устанавливают, вам не нужно беспокоиться о том, что «делает» функция при чтении кода. Есть еще несколько причин, о которых стоит подумать:

  • Если исходный код был защищен (так доступен для подклассов), тогда код становится грязным: кто меняет переменные? Когда это объект, он становится трудным, когда вам нужно провести рефакторинг, тогда как метод облегчает этот шаг.
  • Если ваши методы получения и установки не получают и не устанавливают, то опишите их как что-то еще.

Всегда думайте, действительно ли ваш класс - это нечто другое или нет, и это должно помочь решить, нужно ли вам что-то еще.

7 голосов
/ 25 октября 2008

Конечно .. Почему бы и нет?
Абстрактные базовые классы - это просто удобство для размещения поведения и данных, общих для двух или более классов, в одном месте для эффективности хранения и обслуживания. Это деталь реализации.
Позаботьтесь, однако, о том, что вы не используете абстрактный базовый класс, где вы должны использовать интерфейс. См. Интерфейс против Базового класса

1 голос
/ 25 октября 2008

Конечно. Вся идея абстрактных классов заключается в том, что они могут содержать некоторое поведение или данные, которые требуются для всех подклассов. Вспомните простой пример WheeledVehicle - в нем должна быть переменная-член numWheels. Вы хотите, чтобы все подклассы имели эту переменную. Помните, что абстрактные классы являются очень полезной функцией при разработке API, поскольку они могут гарантировать, что люди, расширяющие ваш API, не нарушат его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...