Статья представляет авторское понимание главы из книги Effective Java, Second Edition by Joshua Bloch
Простым языком определим понятие абстрактного и финального класса:
Абстрактный класс не может быть инстанциирован, но он может иметь подклассы.
Финальный класс это класс от которого запрещено наследоваться.
Для более точного определения обратитесь к официальному туториалу:
Комбинация abstract и final для класса означает, что у класса не может быть наследников и нельзя создать экземпляр для данного класса.
Сделать класс abstract и final одновременно нам, например, необходимо когда мы ходим создать класс утилит, состоящих из статических методов (например java.lang.Math или java.util.Arrays).
Как известно, конструктор по умолчанию создается только если класс не содержит никаких явных конструкторов. Поэтому, определив у класса приватный конструктор без параметров мы обеспечим запрет на его инстанциирование из кода вне класса. AssertionError не является строго обязательным, но он обеспечивает страхование на случай, если конструктор случайно вызван из класса. Это гарантирует, что класс не будет инстанциирован при любых обстоятельствах (abstract). Эта идиома также предотвращает создание подклассов от данного класса(final). Все конструкторы должны вызывать конструктор суперкласса явно или неявно, а подклассы данного класса не будут иметь доступа к конструктору базового класса.
Простым языком определим понятие абстрактного и финального класса:
Абстрактный класс не может быть инстанциирован, но он может иметь подклассы.
Финальный класс это класс от которого запрещено наследоваться.
Для более точного определения обратитесь к официальному туториалу:
Комбинация abstract и final для класса означает, что у класса не может быть наследников и нельзя создать экземпляр для данного класса.
Сделать класс abstract и final одновременно нам, например, необходимо когда мы ходим создать класс утилит, состоящих из статических методов (например java.lang.Math или java.util.Arrays).
Решение
public class UtilityClass {
private UtilityClass() {
throw new AssertionError();
}
... // реализация статических методов
}
* This source code was highlighted with Source Code Highlighter.
Как известно, конструктор по умолчанию создается только если класс не содержит никаких явных конструкторов. Поэтому, определив у класса приватный конструктор без параметров мы обеспечим запрет на его инстанциирование из кода вне класса. AssertionError не является строго обязательным, но он обеспечивает страхование на случай, если конструктор случайно вызван из класса. Это гарантирует, что класс не будет инстанциирован при любых обстоятельствах (abstract). Эта идиома также предотвращает создание подклассов от данного класса(final). Все конструкторы должны вызывать конструктор суперкласса явно или неявно, а подклассы данного класса не будут иметь доступа к конструктору базового класса.