En Java, hay cuatro modificadores de acceso disponibles para los métodos:
public
- Cualquier clase puede usar este método.
protected
- las clases en el mismo paquete y las subclases en cualquier paquete pueden usar este método.
private
- Solo esta clase puede usar este método.
no modifier
("paquete privado"): solo las clases del mismo paquete pueden utilizar este método.
Lo que sucede a menudo es que quiero tener métodos útiles en una superclase, que todas las subclases puedan usar. Pero no tendría sentido para otras clases acceder a este método, y en cierto sentido rompería la encapsulación.
Así que tengo que declarar estos métodos útiles en la superclase public
o protected
, que los expone a todas las demás clases al menos en el paquete. Aunque solo están destinados a ser utilizados por las subclases.
¿Hay alguna razón por la cual no hay un subclasses-only
modificador de acceso en Java? Me parece muy extraño. ¿Me estoy perdiendo de algo?
Además, un subclasses-only
modificador de acceso también sería útil para cuando desee exponer variables solo a subclases. Lo que a mí me pasa mucho.
fuente
Java originalmente tenía un modificador de este tipo. Fue escrito
private protected
pero eliminado en Java 1.0.Supongo que fue una decisión de juicio que la complejidad adicional no valía la pena.
Cada característica del lenguaje tiene un costo: en enseñarla a nuevos programadores; en la documentación; al implementarlo en el compilador, JVM y herramientas de desarrollo; en razonamiento sobre la corrección del programa; en restringir la futura evolución del lenguaje; y más. Las características del lenguaje interactúan entre sí, potencialmente con interacciones N 2 .
¿Qué porcentaje de programadores de Java ha leído las especificaciones del lenguaje Java y las especificaciones de VM? Apuesto a que es un pequeño porcentaje, que defiende un lenguaje aún más simple en aras de la comprensibilidad y los productos de ingeniería en los que podemos confiar
El beneficio de la
private protected
característica fue pequeño ya que el paquete es la unidad principal de modularidad.fuente
El control de acceso puede considerarse como el resultado de una cobertura con un desarrollador imaginario que está trabajando con su clase sobre los métodos y propiedades de la clase ...
Esto es público ...
Esto es privado ...
Esto está protegido ...
Este es el paquete.
Esto está protegido privado ...
fuente
Esto ya existe. Está protegido
Usted tiene control sobre qué clases existen dentro del paquete. Si no hay otra clase en el paquete y una variable o método dado está protegido, es 'solo subclases'.
Dicho esto, una vez más, tienes control sobre qué clases existen dentro del paquete. Puede elegir simplemente no utilizar los métodos o variables protegidos.
fuente