частный конструктор и финал - PullRequest
12 голосов
/ 02 июня 2010

Почему рекомендуется помечать класс только с частными конструкторами как final? Я предполагаю, что это означает, что другие программисты должны знать, что это не может быть разделено на подклассы.

Ответы [ 5 ]

14 голосов
/ 02 июня 2010

Часто (например, Джош Блох и разработчики C #) считают хорошей практикой отмечать все как окончательное, если у вас нет явной причины не делать этого. Предполагая, что вы имеете в виду класс, вы правы, что класс только с закрытыми конструкторами не может быть разделен на подклассы. Таким образом, финал может считаться избыточным, но, как вы говорите, он имеет значение для документации. Как предполагает Марк, это также может помочь в оптимизации.

6 голосов
/ 02 июня 2010

Создание финального класса имеет некоторый (небольшой) выигрыш в производительности, потому что JIT-компилятор может встроить функциональность из этого класса. Я не знаю, квалифицируется ли это как «хорошая практика», но я вижу преимущества.

4 голосов
/ 02 июня 2010

Вы имеете в виду «класс с личным конструктором», не так ли?

Последний класс не может быть разделен на подклассы. Это может представлять проектное решение. Не все классы предназначены для использования в подклассах, поэтому, если у вас их нет, лучше пометить их явно, чтобы избежать мелких ошибок позже.

Класс с закрытыми конструкторами не может быть создан внешним миром (ни в подклассах). Это может быть полезно, например, для синглтоны или классы, где вы хотите контролировать, какие экземпляры класса создаются. Например. до Java5 этот шаблон использовался typesafe enum .

2 голосов
/ 02 июня 2010

Мы помечаем класс как конечный класс, делая конструктор частным, чтобы избежать подкласса.

Это хорошая практика, когда мы не хотим, чтобы люди переопределяли наши методы класса и изменяли функциональность или добавляли функции в наш класс.

Например, классы String и Math являются конечными классами, которые мы не можем ни расширять, ни делить на подклассы, это делается для того, чтобы никто не изменил свое поведение.

1 голос
/ 06 января 2017

Последний класс с приватным конструктором:

  • Класс не может иметь подклассов, мы не можем расширять конечный класс.
  • Класс, имеющий приватный конструктор, мы не можем создать объект этого класса.

Это означает, что другие методы класса будут статическими, чтобы класс мог получить к ним доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...