Java ont un "protégés" modificateur d'accès?


J'ai vu certaines 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é est ici. Ma leçon d'école a également fait référence à ce modificateur d'accès (et a dit qu'il existe). Son utilisation, cependant, entraîne une erreur dans le langage Java.

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

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

Author: Mark Yisri, 2017-01-02

5 answers

Suppression du modificateur d'accès

Java avait à l'origine le modificateur private protected, mais il a été supprimé dans JDK 1.0.2 (la première version stable , la version Java 1.0 que nous connaissons aujourd'hui). Quelques tutoriels concernant JDK 1.0.2 (ici et ici) dire la chose suivante:

Remarque: La version 1.0 du langage Java prend en charge cinq niveaux d'accès: les quatre énumérés ci-dessus plus private protected. Le niveau d'accès private protected 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 indique:

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

Maintenant, jetez un oeil à 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, est appelé Java 1.

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

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, sinon connu comme Java 1.0. Cela est prouvé à nouveau lorsque vous regardez les heures "Dernière modification" pour le lien que vous avez posté. Le lien que vous avez posté a été modifié pour la dernière fois en février 1996. Java 1.0 / JDK 1.0.2, lorsque private protecteda été supprimé, a été publié après février 1996, et selon la spécification, août 1996.

Motif du retrait

Certaines sources expliquent également la raison pour private protected, comme ce un. Pour citer:

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

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 au package). Cela a ensuite été jugé quelque peu incohérent et trop complexe et n'est plus soutenu.[5]

[5] La signification du modificateur protected a changé dans la version Beta2 de Java, et la combinaison private protected est apparue en même temps. Ils ont corrigé un certain potentiel trous de sécurité, mais confus beaucoup de gens.

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

Interprétation

Mon interprétation de tout cela est que peut-être, à l'époque du chêne, les deux ont été autorisés à coexister (d'où la combinaison). Depuis que la signification de protected avait changé1, il peut avoir été nécessaire d'autoriser private et protected en 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 roulé, il avait été abandonné et ne peut donc pas être trouvé dans la documentation.


1Dans la Spécification de langage Oak , Section 4.10, Accès aux variables et aux 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é.

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

 189
Author: Li357, 2017-04-13 12:45:55

Il y a des histoires confuses/peu claires:

Un, de la source de Princeton que vous mettez, et aussi de MIT archives , indique que:

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

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

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

PS: honte à Oracle pour la suppression des archives pour les anciennes versions.

 53
Author: m0skit0, 2017-01-03 18:18:13

Comme le lien que vous avez fourni dans votre question suggère que private protected a été utilisé sur un element/member d'une classe, lorsque vous voulez que votre subclass puisse accéder à l'élément mais le garder caché des autres classes dans son package.

Java si par rapport à C++ a une notion d'encapsulation des éléments - et c'est un Package. Il faut également comprendre ce qui est accessible à l'intérieur ou à l'extérieur d'un paquet dans Java quand 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

 12
Author: Game_Of_Threads, 2017-02-01 08:38:18

Non, vous ne pouvez pas utiliser les deux private un protected ensemble. Votre tutoriel est étrange. Ce que vous avez est ce qu'on appelle package private ou dans les références ot6 package protected access. C'est l'accès par défaut qui est activé lorsqu'aucun qualificateur acc6 n'est écrit explicitement.

 1
Author: AlexR, 2017-01-02 18:28:22

Private scope intègre la classe existante. Dans lequel Protégé peut être l'accès dans le paquet et la classe étendue par des classes dans d'autres paquets.

De manière transparente si vous voulez que votre variable/méthodes soit un accès 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 un package extérieur et dans des sous-classes, c'est-à-dire qu'une classe doit étendre la classe respective pour bénéficier de protected defined méthode.

Les méthodes/variables privées ont une portée dans la classe.Ils 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!

 -3
Author: Tejas Gowda, 2017-01-29 15:41:01