Это невозможно "хорошими способами".Язык Java позволяет вам либо иметь ключевое слово final
в вашем определении класса, либо не иметь его.
Как отмечают другие: вы можете сделать все конструкторы частными, тогда подклассы становятся практически невозможными, поскольку конструкторы подкласса не имеют конструктора суперкласса для вызова.
В случае, если вам нужно создать экземпляр Aу вас все еще может быть фабричный метод, например:
public class A {
private A() { ... }
private A(String foo) { ... }
public static A newInstance(String foo) { return new A(foo); }
.
Но имейте в виду: код написан для ваших читателей-людей.Если ваше намерение должно иметь окончательный класс, тогда правильный ответ - использовать это ключевое слово final
.
Плюс: окончательное определение класса позволяет JIT делать еще несколько вещей, поскольку ему не нужно беспокоиться о полиморфизме в любой момент (так что он может напрямую встроить код метода без каких-либо дополнительных проверок).Таким образом, использование final
может привести к незначительному улучшению производительности.С другой стороны, он ограничивает вашу способность проводить юнит-тесты (например: стандартный Mockito не может издеваться над финальными классами).