Bastante nuevo en Java, pero me pregunto por qué el acceso al paquete se considera "más restrictivo" que el acceso a la subclase. Es decir, cada modificador de acceso que proporciona subclases con acceso a un miembro también proporciona acceso a todo el paquete, y existen modificadores que proporcionan acceso de paquete pero no acceso de subclase.Java: Acceso a la subclase sin acceso al paquete
¿No es esto totalmente al revés? Digamos que tengo una clase ControlledInstantiation en algún paquete. Si tengo otra clase AlsoControlledInstantiation extends ControlledInstantiation, no puedo llamar al constructor de ControlledInstantiation a menos que lo configure como protegido o público. Y si lo configuro como protegido, ahora cualquier otra clase en el paquete puede instanciarlo tan a menudo como quiera. Entonces, algo que está obligado a ser sustituible por su superclase (y, sintácticamente, es) obtiene el mismo o menor acceso a la superclase que algo que cumple una función distinta pero relacionada. Es como decirle a su hijo que no puede jugar con su billetera porque no le permite a sus vecinos hacerlo y luego dejar que sus vecinos duerman en su casa porque su hijo sí.
Así que supongo que estoy preguntando, ¿qué motivó esta decisión y cómo puedo evitarla?
pero está escribiendo el código para "ControlledInstantiation" y, por lo tanto, presumiblemente es el propietario del código en su paquete. ¿Está diciendo que no confía en usted mismo? – pstanton
Cualquiera puede crear una nueva clase en cualquier paquete, excepto los que protege el cargador de clases. A menos que oculte el nombre del paquete de una clase usada internamente en todas mis interfaces documentadas (lo cual, pienso, es imposible, ya que incluso una fábrica tiene que importar la clase que crea, y en algún momento debe hacerse referencia a la fábrica, etc. .), cualquiera puede poner una clase en ese paquete. Es casi seguro que las personas no lo harían, a menos que quisieran hacer algo que no deberían hacer, pero podrían hacerlo. – Innominate