Java a-t-il un modificateur d'accès «privé protégé»?

160

J'ai vu quelques références faire référence à un modificateur d'accès en Java appelé private protected(les deux mots ensemble):

private protected someMethod() {

}

L'une des pages que j'ai trouvées à ce sujet se trouve ici . Ma leçon scolaire faisait également référence à ce modificateur d'accès (et disait qu'il existe). Cependant, son utilisation entraîne une erreur dans le langage Java.

J'ai essayé avec des variables et des méthodes et je suis à peu près sûr que cela n'existe pas, mais je veux une explication de ce qui s'est passé. A-t-il été envisagé, puis rejeté? Ou a-t-il été supprimé dans une version plus récente de Java?

Edit: Je ne cherche pas d'informations sur le protectedmot - clé.


la source
60
La page que vous avez trouvée définit un en-tête HTTP "Last-Modified" de: Mon, 26 Fév 1996 18:14:04 GMT!
G. Sylvie Davies
6
@Joe Je suis tout à fait favorable à la clôture des questions comme dupes lorsque cela est possible, mais je ne vois rien à propos d'un private protectedmodificateur combiné .
jpmc26
2
@ jpmc26 Voir "Dans Java 1.0, il y avait un modificateur d'accès supplémentaire, private protected." Cependant, la réponse ici est un bien meilleur résumé de l'histoire.
Joe le
2
@Joe Il y a effectivement une référence private protecteddans cette réponse, mais cela n'explique pas pourquoi ni ce qui lui est arrivé, de quoi parle cette question.
m0skit0
3
Quelqu'un d'autre trouve-t-il effrayant que le PO apprenne cela à l'école ... plus de 20 ans après qu'il a été retiré des Docs? Leçon d'histoire intéressante, mais toujours un peu effrayante que les gens apprennent quelque chose qui a été supprimé avant que Java 1 ne soit nommé ...
XaolingBao

Réponses:

191

Suppression du modificateur d'accès

Java avait à l'origine le private protectedmodificateur, mais il a été supprimé dans JDK 1.0.2 (la première version stable , le Java 1.0 que nous connaissons aujourd'hui). Quelques tutoriels concernant JDK 1.0.2 ( ici et ici ) disent ce qui suit:

Remarque: la version 1.0 du langage Java prenait en charge cinq niveaux d'accès: les quatre répertoriés ci-dessus plus private protected. Le private protectedniveau d'accès n'est pas pris en charge dans les versions de Java supérieures à 1.0; vous ne devriez plus l'utiliser dans vos programmes Java.

Une autre réponse sur SoftwareEngineering.SE déclare:

Java avait à l'origine un tel modificateur. Il a été écrit private protectedmais supprimé dans Java 1.0.

Jetez maintenant un œil à l' historique des versions de Java :

JDK 1.0

La première version est sortie le 23 janvier 1996 et s'appelle Oak. La première version stable, JDK 1.0.2, s'appelle Java 1.

De là, nous pouvons conclure que les tutoriels concernant la version 1.0.2 font référence à la toute première version, JDK 1.0, où le langage s'appelait Oak, mais celui de SoftwareEngineering.SE se réfère à la première version stable, JDK 1.0.2 appelée Java 1.0, où il a été supprimé.

Maintenant, si vous essayez de le rechercher dans la documentation Java 1.0 , vous ne le trouverez pas, car comme mentionné précédemment, il a été supprimé dans JDK 1.0.2, autrement connu sous le nom de Java 1.0. Ceci est prouvé à nouveau lorsque vous regardez les heures de «Dernière modification» pour le lien que vous avez publié. Le lien que vous avez publié a été modifié pour la dernière fois en février 1996. Java 1.0 / JDK 1.0.2, lorsqu'il a private protectedété supprimé, a été publié après février 1996 et, selon les spécifications, en août 1996.

Raison de la suppression

Certaines sources expliquent également la raison private protected, comme celle- ci. Citer:

Qu'est-ce qui était protégé privé?

Au début, le langage Java permettait certaines combinaisons de modificateurs, dont l'un était private protected. La signification de private protectedétait de limiter la visibilité strictement aux sous-classes (et de supprimer l'accès aux packages). Cela a par la suite été jugé quelque peu incohérent et trop complexe et n'est plus pris en charge. [5]

[5] La signification du protectedmodificateur a changé dans la version Beta2 de Java et la private protectedcombinaison est apparue en même temps. Ils ont corrigé certaines failles de sécurité potentielles, mais ont dérouté de nombreuses personnes.

Et le SoftwareEngineering.SE soutient également cela, en disant que cela ne valait pas la peine des incohérences et de la complexité supplémentaire, donc il a été supprimé très tôt.

Interprétation

Mon interprétation de tout cela est que peut-être, à l'époque du chêne, les deux étaient autorisés à coexister (d'où la combinaison). Étant donné que protectedle sens de ce terme avait changé 1 , il a peut-être été nécessaire de permettre privateet protecteden même temps. L'introduction est devenue trop complexe et n'en valait pas la peine, et a donc été abandonnée à la fin. Au moment où Java 1.0 / JDK 1.0.2 a été déployé, il avait été abandonné et ne peut donc pas être trouvé dans la documentation.


1 Dans la spécification du langage Oak , Section 4.10, Accès aux variables et méthodes , il est noté que le modificateur par défaut était protected:

Par défaut, toutes les variables et méthodes d'une classe sont protégées .

C'est assez différent de ce que nous avons aujourd'hui, l'accès par défaut aux packages. Cela a peut-être ouvert la voie à la nécessité de private protected, car il privateétait trop restrictif et protectedtrop indulgent.

Andrew Li
la source
Je suis sûr que cela ne vaut pas grand-chose - mais je me souviens quand c'est arrivé (je programmais quand j'étais enfant et j'étais très intéressé par ce nouveau truc Java pour une raison quelconque) et bien que je ne trouve aucune des sources originales - je me souviens des choses exactement comme ça quand je les ai suivis.
Benjamin Gruenbaum
Early on, the Java language allowed for certain combinations of modifiers, Cela signifie-t-il qu'il y avait plus que simplement "Protégé privé"?
XaolingBao le
@XaolingBao Bien sûr, un seul accesseur est comme aucun accès :) Les liens fournis devraient clarifier votre question.
m0skit0
52

Il y a des histoires déroutantes / peu claires:

L'un, de la source de Princeton que vous avez indiquée, ainsi que des archives du MIT , déclare que:

Remarque: la version 1.0 du langage Java prenait en charge cinq niveaux d'accès: les quatre répertoriés ci-dessus plus privé protégé. Le niveau d'accès protégé privé n'est pas pris en charge dans les versions de Java supérieures à 1.0; vous ne devriez plus l'utiliser dans vos programmes Java.

Mais cette fonctionnalité n'est spécifiée sur aucune documentation officielle de Java 1.0 ici ou ici .

Je suppose que cette fonctionnalité n'a pas atteint la version officielle 1.0, car la spécification de la langue officielle date d'août 1996 et la source de Princeton a été modifiée pour la dernière fois en février 1996 .

PS: dommage à Oracle d'avoir supprimé les archives des anciennes versions.

m0skit0
la source
mon lien est-il donc une ancienne version du même contenu? : D
Peut-être que les informations manquantes ont quelque chose à voir avec cette note que vous avez mise.
@AndrewLi Ni l'un ni l'autre n'est déclaré stable sur les références données. Et il est vraiment déroutant de se référer à 1.0.2 comme 1.0 quand il y a un 1.0 réel.
m0skit0
10

Comme le lien que vous avez fourni dans votre question le suggère, a private protectedété utilisé sur une element/memberclasse, lorsque vous voulez subclasspouvoir accéder à l'élément tout en le gardant caché des autres classes de son package.

Javasi comparé à C++a un concept supplémentaire d'éléments d'encapsulation - et c'est un package . Il faut également comprendre ce qui est accessible à l'intérieur ou à l'extérieur d'un package Javalorsqu'il s'agit de ces spécificateurs d'accès comme private, public& protected.

Veuillez noter que j'ai expliqué pourquoi il a été utilisé. Pas dans la version actuelle bien sûr

programmer_of_the_galaxies
la source
Mon lien est pour l'accès aux méthodes. Pas d'accès membre.
1
@MarkYisri peut également être utilisé pour les variables membres. Les spécificateurs d'accès ne fonctionnent pas seulement sur les méthodes mais aussi sur les variables membres. En d'autres termes, les spécificateurs d'accès sont des concepts d'encapsulation et sont indépendamment du fait que vous les appliquiez aux méthodes membres ou aux variables membres. qui s'applique à presque tous les langages orientés objet, y compris C ++ et java
programmer_of_the_galaxies
D'accord, mais le tutoriel (fait intéressant) ne mentionne pas privé protégé sur les variables. Attendez et laissez-moi voir s'il y a une page de variables ...
0

Non, vous ne pouvez pas utiliser à la fois privateun protectedensemble. Votre tutoriel est étrange. Ce que vous avez, c'est ce qu'on appelle le package private ou dans ot6 references package protected access. Il s'agit d'un accès par défaut qui est activé lorsqu'aucun qualificatif acc6 n'est écrit explicitement.

AlexR
la source
3
J'étais conscient que vous ne pouvez pas l'utiliser. Je veux savoir ce qui lui est arrivé, ce que les autres réponses expliquent mieux.
4
Eh bien, le lien date de 1996, donc étant donné que le développement Java venait de commencer environ un an plus tôt, le contenu du lien n'est pas vraiment étrange: D
Keiwan
6
Bon point sur la date de chaque document. J'ai répondu à la question alors que mon train arrivait et l'ai écrite par téléphone, donc désolé si la réponse n'avait pas suffisamment déraillé. Je voulais juste aider ...
AlexR
6
@AlexR votre faute d'orthographe déraillée est en fait un jeu de mots (train). Juste remarqué. : D
1
@MarkYisri, détaillé. Écrire au téléphone n'est pas la meilleure façon de publier des réponses sur SO.
AlexR
-2

L'étendue privée est avec la classe existante. Wherein Protected peut être accès dans le package et la classe étendue par des classes dans d'autres packages.

De manière transparente si vous voulez que votre variable / méthodes soit accessible en dehors du package, vous devez définir comme protégé / public sinon privé ou d'autres spécificateurs d'accès.

Les méthodes protégées sont généralement accessibles depuis l'extérieur du package et dans les sous-classes, c'est-à-dire qu'une classe doit étendre la classe respective pour bénéficier des méthodes définies protégées.

Les méthodes / variables privées ont une portée dans la classe et ne peuvent pas être accessibles en dehors de la classe.

Par conséquent, vous ne pouvez pas définir Private Protected en même temps!

Tejas Gowda
la source
Cela n'a pas répondu à la question. J'ai demandé pourquoi cela ne fonctionnait pas. Les autres réponses font un bien meilleur travail pour répondre à la question.
Pour clarifier davantage, je sais que cela ne fonctionne plus maintenant, mais les autres réponses expliquent pourquoi et ce qui s'est passé dans le passé. Le vôtre ne l'est pas.