Наличие частного конструктора пакета не гарантирует 100% неизменности, как уже упоминалось в комментарии:
В одном пакете можно создать изменяемый подкласс
Разрабатывая библиотеку jar
, вы можете заключить некоторые соглашения внутри команды и сопровождающих пакетов, что из couse не реализует это программно, но все же каким-то образом находится под контролем разработчиков продукта.
А как насчет других?Можно создавать классы вне вашей библиотеки, но в одном и том же пакете и в нескольких местах в пути к классам.
Если у вас есть такие случаи и вы сталкиваетесь с подобными вопросами, в игру вступает Package Sealing .
Пакеты в файлах JAR могут быть опционально запечатаны, что означает, что все классы, определенные в этом пакете, должны быть заархивированы в одном и том же файле JAR.Возможно, вы захотите запечатать пакет, например, для обеспечения согласованности версий между классами в вашем программном обеспечении.
Если вы хотите гарантировать, что все классы в пакете происходят из одного и того же источника кода, используйте уплотнение JAR.Запечатанный JAR указывает, что все пакеты, определенные этим JAR, запечатаны, если они не переопределены для каждого пакета.
Допустим, у вашего jar
libarary есть класс com.example.Factory
с protected/package-private
членамии пакет com.example
запечатан.Попытка создания класса com.example.Accessor
, который пытается получить доступ к этим членам, должна завершиться неудачей.
Таким образом вы можете обеспечить доступ к package-private
членам ограниченной (и потенциально доверенной) группы членов.
Возвращаясь к основному вопросу:
Так будет ли класс по-прежнему неизменным с помощью приватного конструктора пакета?
При строгих соглашениях между сопровождающими, тщательной проверкой кода и пакетазапечатывание это может стать своего рода неизменным.