Почему хорошая практика отмечать класс только частными конструкторами как final? Я предполагаю, что это означает, что другие программисты знают, что его нельзя подклассифицировать.
Частный конструктор и конечный
Ответ 1
Создание окончательного класса имеет некоторое (небольшое) усиление производительности, поскольку компилятор JIT может встроить функциональность из этого класса. Я не знаю, соответствует ли это "хорошей практике", но я вижу преимущества.
Ответ 2
Часто считается (например, Джошем Блохом и дизайнерами С#) хорошая практика отмечать все как окончательные, если у вас нет явной причины не делать этого. Предполагая, что вы имеете в виду класс, вы правы, что класс с только частными конструкторами нельзя подклассифицировать. Таким образом, окончательный вариант можно считать избыточным, но, как вы говорите, он имеет ценность для документации. Как предполагает Марк, это также может помочь в оптимизации.
Ответ 3
Вы имеете в виду "класс с частным конструктором", вы?
Последний класс нельзя подклассифицировать. Это может быть дизайнерское решение. Не все классы предназначены для подкласса, поэтому, если у вас нет, лучше всего пометить его, чтобы избежать тонких ошибок позже.
Класс с частными конструкторами только не может быть создан внешним миром (ни подклассами). Это может быть полезно, например, синглтоны или классы, в которых вы хотите контролировать, какие экземпляры класса создаются. Например. перед Java5 используется typeafe enum.
Ответ 4
Мы отмечаем класс как окончательный класс, делая конструктор закрытым, чтобы избежать подклассификации.
Это хорошая практика, в тех случаях, когда мы не хотим, чтобы люди переопределяли наши методы класса и меняли функциональность или добавляли функции в наш класс.
Например, классы String и Math являются конечными классами, которые мы не можем расширять или подклассы, это значит, что никто не изменит свое поведение.
Ответ 5
Последний класс с частным конструктором:
- Класс не может иметь подклассы, мы не можем расширять окончательный класс.
- Класс, имеющий частный конструктор, мы не можем создать объект этого класса.
Это означает, что другие методы класса будут статичными, поэтому класс может получить к ним доступ.