Нет, переопределение не рекомендуется в Java.
- Язык допускает переопределение .
- Язык делает все методы переопределенными по умолчанию .
- Библиотека классов Java содержит примеры того же шаблона.
Ваш подход является одним из разумных способов, позволяющих подклассам расширять поведение своего родительского класса.Есть альтернативы, такие как передача поведения как объекта.Однако единственно верного пути не существует.
Один из способов улучшить код - пометить preProcess () как protected .Это деталь реализации класса.Вам не нужно, чтобы кто-либо, имеющий RecordProcessor, решал, что он может вызывать preProcess () сам по себе, верно?
public class RecordProcessor<T extends Record> {
...
protected void preProcess() {
^^^^^^^^^
// By default no preprocessing
}
}
Еще один способ улучшить это - подумать, намерены ли вы создать экземпляр объекта.Суперкласс RecordProcessor.Если вы этого не сделаете, сделайте класс abstract , чтобы предотвратить это.Имя класса может выражать это, если хотите, или ваши правила кодирования требуют его.
public abstract class AbstractRecordProcessor<T extends Record> {
^^^^^^^^ ^^^^^^^^
...
protected void preProcess() {
// By default no preprocessing
}
}
Один из распространенных способов документировать такие методы - с помощью фразы "Реализация по умолчанию ничего не делает. Подклассыможет переопределить этот метод ... ".Например, ниже приведена документация для java.util.concurrent.FutureTask.done()
.Вы можете найти больше примеров, выполнив поиск первого предложения этой фразы в Интернете.
public class FutureTask<V> implements RunnableFuture<V> {
...
/**
* Protected method invoked when this task transitions to state
* {@code isDone} (whether normally or via cancellation). The
* default implementation does nothing. Subclasses may override
* this method to invoke completion callbacks or perform
* bookkeeping. Note that you can query status inside the
* implementation of this method to determine whether this task
* has been cancelled.
*/
protected void done() { }
}