Другие отметили, что конструкторы могут иметь модификаторы доступа; аспект еще не упоминается в том, что аспект модификаторы на элементе управления конструктора две очень разные аспекты строительства, но не позволяют им управлять отдельно:
- Кто может создавать экземпляры из
ClassName
и каких конструкторов разрешено ли им пользоваться.
- Кому разрешено создавать расширения от
ClassName
и какие конструкторы им разрешено использовать.
Как Java, так и .NET требуют, чтобы ответы на эти два вопроса совпадали; если класс не final
(или sealed
) и позволяет конструктору использовать внешний код для создания новых экземпляров, тогда внешний код также будет иметь полную свободу использовать тот же самый конструктор для создания производных типов.
Во многих случаях может быть целесообразным, чтобы класс имел только конструкторы private-private (internal
), но раскрывал общедоступные методы, возвращающие новые экземпляры. Такой подход может быть использован, если вы разрабатываете такой тип, как String
с нуля; пакет, содержащий String
, может определять его как абстрактный тип, но включает в себя конкретные производные типы, такие как AsciiString
и UCS16String
, которые хранят их содержимое как byte[]
и Char[]
соответственно; методы, возвращающие String
, могут затем вернуть одну из производных в зависимости от того, содержат ли строки символы вне диапазона ASCII. Если ни String
, ни любые производные типы не выставляют никаких конструкторов вне его пакета, и все производные типы внутри пакета будут вести себя как строка, как ожидается, будут вести себя, тогда код, который получает ссылку типа String
, может ожидать, что он будет вести себя как строка (например, например, гарантируя, что любые наблюдения за его значением навсегда останутся верными). Однако использование конструкторов вне пакета позволило бы производным типам вести себя странным и причудливым образом (например, изменять их содержимое после того, как они были проверены и проверены).
С синтаксической точки зрения, будучи в состоянии сказать Fnord foo = new Fnord(123);
немного лучше, чем того, чтобы сказать Fnord foo = Fnord.Create(123);
, но класс Fnord
, который требует последнего синтаксиса может поддерживать гораздо лучше контролировать процесс объектно-создание.
@George Stocker Название является дубликатом, я согласен. Но на самом деле возникает вопрос: «Почему я хочу объявить частный конструктор?» В этом случае на этот вопрос отвечает только наименьший ответ в дубликате и только тангенциально. – Teepeemm
@HashLeon Я попросил вас сузить свой вопрос; ваш первый вопрос - это дубликат того, на котором я его закрыл, а ваш второй вопрос - это дубликат этого вопроса: http: // stackoverflow.com/questions/17342815/what-is-use-of-private-constructor-in-java –