java access-modifiers

¿Java tiene un modificador de acceso "privado protegido"?



protected package (5)

He visto algunas referencias que se refieren a un modificador de acceso en Java llamado private protected (ambas palabras juntas):

private protected someMethod() { }

Una de las páginas que encontré haciendo referencia a esto está here . La lección de mi escuela también se refirió a este modificador de acceso (y dijo que existe). Sin embargo, su uso da como resultado un error en el lenguaje Java.

Intenté con variables y métodos y estoy bastante seguro de que no existe, pero quiero una explicación de lo que sucedió. ¿Fue considerado, luego rechazado? ¿O se eliminó en una versión más nueva de Java?

Editar: no estoy buscando información sobre la palabra clave protected .


Eliminación del modificador de acceso.

Originalmente, Java tenía el modificador private protected , pero se eliminó en JDK 1.0.2 (la primera versión estable , la Java 1.0 que conocemos hoy). Algunos tutoriales sobre JDK 1.0.2 ( here y here ) dicen lo siguiente:

Nota: La versión 1.0 del lenguaje Java admite cinco niveles de acceso: los cuatro enumerados anteriormente más private protected . El nivel de acceso private protected no es compatible con versiones de Java superiores a 1.0; ya no deberías usarlo en tus programas Java.

Otra respuesta sobre SoftwareEngineering.SE afirma:

Java originalmente tenía un modificador de este tipo. Fue escrito private protected pero eliminado en Java 1.0.

Ahora eche un vistazo al Historial de versiones de Java :

JDK 1.0

La primera versión se lanzó el 23 de enero de 1996 y se llamó Oak. La primera versión estable, JDK 1.0.2, se llama Java 1.

De esto, podemos concluir que los tutoriales con respecto a la versión 1.0.2 se refieren a la primera versión, JDK 1.0, donde el lenguaje se llamaba Oak, pero el de SoftwareEngineering.SE se refiere a la primera versión estable, JDK 1.0.2 llamada Java 1.0, donde fue eliminado.

Ahora, si intenta buscarlo en la documentación de Java 1.0 , no lo encontrará, porque como se mencionó anteriormente, se eliminó en JDK 1.0.2, también conocido como Java 1.0. Esto se prueba nuevamente cuando mira las horas de "Última modificación" para el enlace que publicó. El enlace que publicó se modificó por última vez en febrero de 1996. Java 1.0 / JDK 1.0.2, cuando se eliminó private protected , se lanzó después de febrero de 1996 y, según las especificaciones, agosto de 1996.

Motivo de Retiro

Algunas fuentes también explican la razón de private protected , como this . Citar:

¿Qué fue privado protegido?

Al principio, el lenguaje Java permitía ciertas combinaciones de modificadores, uno de los cuales estaba private protected . El significado de private protected era limitar la visibilidad estrictamente a las subclases (y eliminar el acceso al paquete). Más tarde, esto se consideró algo inconsistente y demasiado complejo y ya no es compatible. [5]

[5] El significado del modificador protected cambió en la versión Beta2 de Java, y la combinación private protected apareció al mismo tiempo. Remendaron algunos posibles agujeros de seguridad, pero confundieron a muchas personas.

Y SoftwareEngineering.SE también apoya esto, al decir que no valía la pena las inconsistencias y la complejidad adicional, por lo que se eliminó desde el principio.

Interpretación

Mi interpretación de todo esto es que quizás, en los días de Oak, a ambos se les permitió coexistir (de ahí la combinación). Dado que el significado de protected había cambiado 1 , puede haber sido necesario permitir que private y protected al mismo tiempo. La introducción se volvió demasiado compleja y no valió la pena, por lo que finalmente se abandonó. En el momento en que Java 1.0 / JDK 1.0.2 llegó, ya se había eliminado y, por lo tanto, no se puede encontrar en la documentación.

1 En la Especificación del lenguaje Oak , Sección 4.10, Acceso a variables y métodos , se observa que el modificador predeterminado estaba protected :

Por defecto, todas las variables y métodos de una clase están protegidos .

Esto es bastante diferente de lo que tenemos hoy, el acceso predeterminado al paquete. Esto puede haber allanado el camino para la necesidad de private protected , porque lo private era demasiado restrictivo y lo protected era demasiado indulgente.


Como el enlace que proporcionó en su pregunta sugiere que se usó private protected en un element/member de una clase, cuando desea que su subclass pueda acceder al elemento pero mantenerlo oculto de otras clases en su package .

Java comparación con C++ tiene un concepto adicional de elementos encapsulados, y ese es un paquete . También se debe entender qué es accesible dentro o fuera de un paquete en Java cuando se trata de estos especificadores de acceso como private , public y protected .

Tenga en cuenta que he explicado por qué se utilizó. No en la versión actual, por supuesto.


El ámbito privado está dentro de la clase existente. En donde Protegido se puede acceder dentro del paquete y la clase extendida por las clases en otros paquetes.

Sin problemas si desea que sus variables / métodos tengan acceso fuera del paquete, debe definirlo como protegido / público, de lo contrario privado o algún otro especificador de acceso.

Por lo general, se puede acceder a los métodos protegidos desde un paquete externo y dentro de subclases, es decir, una clase tiene que extender la clase respectiva para aprovechar los métodos definidos protegidos.

Los métodos / variables privadas tienen alcance dentro de la clase. No pueden ser accesibles fuera de la clase.

Por lo tanto, no puede definir Private Protected al mismo tiempo.


Hay historias confusas / poco claras:

Uno, de la fuente de Princeton que pones, y también de los here del here , afirma que:

Nota: La versión 1.0 del lenguaje Java admite cinco niveles de acceso: los cuatro enumerados anteriormente más privado protegido. El nivel de acceso protegido privado no es compatible con versiones de Java superiores a 1.0; ya no deberías usarlo en tus programas Java.

Pero esta característica no se especifica en ninguna documentación oficial para Java 1.0 aquí o here .

Supongo que esta característica no llegó a la versión oficial 1.0, ya que la especificación del idioma oficial es de agosto de 1996 y la fuente de Princeton se modificó por última vez en febrero de 1996 .

PD: lástima de Oracle por eliminar los archivos de versiones anteriores.


No, no puedes usar ambos private y protected juntos. Tu tutorial es extraño. Lo que tienes es el llamado paquete privado o en acceso de paquete protegido de ot6 referencias. Este es el acceso predeterminado que se habilita cuando no se escribe explícitamente ningún calificador acc6.