Java - абстрактный класс для хранения переменных?
Хорошо ли использовать абстрактные классы для определения переменных экземпляра?
public abstract class ExternalScript extends Script {
String source;
public abstract void setSource(String file);
public abstract String getSource();
}
Подкласс класса ExternalJavaScript.class автоматически получит исходную переменную, но мне легче читать код, если все подклассы сами определяют источник, а не наследование.
Каков ваш совет?
/Adam
Ответы
Ответ 1
Я бы подумал, что что-то вроде этого будет намного лучше, поскольку вы добавляете переменную, поэтому почему бы не ограничить доступ и сделать его более чистым? Ваши геттеры/сеттеры должны делать то, что они говорят на олове.
public abstract class ExternalScript extends Script {
private String source;
public void setSource(String file) {
source = file;
}
public String getSource() {
return source;
}
Возвращаясь к этому вопросу, вы когда-нибудь задумывались о том, где читается код getter/setter? Если все они получают и устанавливают, вам не нужно беспокоиться о том, что функция "делает" при чтении кода.
Есть еще несколько причин думать об этом:
- Если источник был защищен (так доступен подклассам), тогда код становится беспорядочным: кто меняет переменные? Когда это объект, он становится тяжелым, когда вам нужно реорганизовать, тогда как метод имеет тенденцию облегчать этот шаг.
- Если ваши методы getter/setter не получают и не устанавливают, то описывайте их как что-то еще.
Всегда думайте, действительно ли ваш класс другой или нет, и это должно помочь решить, нужно ли вам что-то еще.
Ответ 2
Конечно. Почему бы и нет?
Абстрактные базовые классы - это просто удобство для размещения поведения и данных, общих для 2 или более классов, в одном месте для повышения эффективности хранения и обслуживания. Его деталь реализации.
Однако обратите внимание, что вы не используете абстрактный базовый класс, где вы должны использовать интерфейс. См. Интерфейс vs Базовый класс
Ответ 3
Конечно. Вся идея абстрактных классов состоит в том, что они могут содержать какое-либо поведение или данные, которые вам требуются для всех подклассов. Подумайте о простом примере WheeledVehicle - он должен иметь переменную члена numWheels. Вы хотите, чтобы все под-классы имели эту переменную. Помните, что абстрактные классы - очень полезная функция при разработке API-интерфейсов, поскольку они могут гарантировать, что люди, которые расширяют ваш API, не нарушат его.