¿Por qué no hay modificador de visibilidad de subclase en Java?


En más de una ocasión me he encontrado deseando una visibilidad variable que no es posible en Java. Quería que ciertos miembros fueran visibles dentro de su propia clase y dentro de cualquier subclase, pero no para el resto del paquete o para el resto del mundo. En otras palabras, yo quería esto:

Modifier        Class     Package   Subclass  World
sub-class       Y         N         Y         N

Sin embargo, los diseñadores de Java solo me dieron esto :

Modifier        Class     Package   Subclass  World
public          Y         Y         Y         Y
protected       Y         Y         Y         N
no modifier     Y         Y         N         N
private         Y         N         N         N

El caso típico cuando quiero algo como esto es cuando se crea una clase abstracta. A veces yo find the abstract parent necesita acceso a ciertos miembros, pero los niños concretos también lo necesitan. Puedo darles este acceso haciendo que los miembros protected, pero eso abre la accesibilidad al resto del paquete cuando realmente no quiero.

Para ser completamente claro, sé que tal modificador es no posible en Java. Mi pregunta es ¿por qué no se incluye este modificador en Java? Me parece (a mí) que es un nivel de visibilidad más natural que protected o el predeterminado. Es la razón en la línea de que no es lo suficientemente importante para ser incluido, o está más relacionado con posibles efectos secundarios que no he considerado?

Author: Michael McGowan, 2011-03-14

3 answers

Supongo que quieren evitar la complejidad añadida al tener una jerarquía de acceso no lineal.

Debería tener control sobre su paquete, así que simplemente no llame a estos métodos protegidos allí.

(Por cierto, protected no es exactamente lo mismo que sub-class and package, ya que los métodos protegidos no estáticos (si no están en el mismo paquete) no se pueden invocar en objetos arbitrarios de la clase declarante, sino solo en objetos de la subclase en la que se encuentra el código. (Puedes ver esto en Object.clone(), que solo puede ser llamado por la clase cuyo objeto está siendo clonado.))

 17
Author: Paŭlo Ebermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-14 15:03:06

Aparentemente consideran que ser-un-subtipo-deno es una "relación cercana" como estar-en-el-mismo-paquete-de. Y para el modificador que sugieres, no diferiría mucho de protected a menos que la subclase estuviera realmente en un paquete diferente, y yo afirmaría, que estar en el mismo paquete, debe considerarse una relación más cercana, que ser una subclase en un paquete completamente diferente.

 6
Author: aioobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-14 18:56:10

Debe poner su clase en un paquete propio y marcar el miembro(variable de instancia o método) como protegido. De esta manera, ninguna otra clase, excepto las subclases, puede acceder a ese miembro que usted comercializa como protegido. Terminará con una clase en un paquete, si desea desesperadamente que solo las subclases accedan a ese miembro protegido.

 3
Author: Tiberiu Rogojan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-14 15:38:03