Java dispose-t-il d’un modificateur d’access «privé protégé»?

J’ai vu certaines références se référer à un modificateur d’access en Java appelé private protected (les deux mots ensemble):

 private protected someMethod() { } 

Une des pages que j’ai trouvé se référant à ceci est ici . Ma leçon d’école faisait également référence à ce modificateur d’access (et dit qu’il existe). Son utilisation entraîne toutefois une erreur dans le langage Java.

J’ai essayé avec les variables et les méthodes et je suis quasiment certain 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 at-il été supprimé dans une nouvelle version de Java?

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

Suppression du modificateur d’access

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

Remarque: La version 1.0 du langage Java prenait en charge cinq niveaux d’access: les quatre répertoriés ci-dessus, plus private protected . Le niveau d’access 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 initialement un tel modificateur. Il a été écrit en private protected mais supprimé dans Java 1.0.

Jetez maintenant un coup d’œ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 cela, nous pouvons conclure que les didacticiels 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ù 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, également connu sous le nom de Java 1.0. Cela 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, lorsque private protected été supprimé, a été publié après février 1996 et conformément à la spécification d’août 1996.

Raison du retrait

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

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

Au début, le langage Java autorisait certaines combinaisons de modificateurs, dont l’une était private protected . La notion de private protected à limiter la visibilité aux sous-classes (et à supprimer l’access 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 modificateur protected modifiée dans la version Beta2 de Java, et la combinaison private protected est apparue en même temps. Ils ont réparé des trous de sécurité potentiels, mais ont confondu 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 dans les jours de Oak, les deux ont été autorisés à coexister (d’où la combinaison). Puisque le sens de protected avait changé 1 , il pouvait être nécessaire de permettre à la fois private et protected . L’introduction est devenue trop complexe et ne 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 a été supprimé et ne peut plus être trouvé dans la documentation.


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

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

Ceci est assez différent de ce que nous avons aujourd’hui, l’access au paquet par défaut. Cela a peut-être ouvert la voie au besoin de private protected , parce que le private était trop ressortingctif et que la protected était trop indulgente.

Il y a des histoires confuses / peu claires:

L’une, de la source Princeton que vous avez mise à disposition, ainsi que des archives du MIT , indique que:

Remarque: La version 1.0 du langage Java prenait en charge cinq niveaux d’access: les quatre répertoriés ci-dessus, plus la protection privée. Le niveau d’access 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 pour Java 1.0 ici ou ici .

Je suppose que cette fonctionnalité n’a pas été publiée dans la version 1.0 officielle, puisque les spécifications de la langue officielle datent d’août 1996 et que la source de Princeton a été modifiée pour la dernière fois en février 1996 .

PS: dommage pour Oracle de supprimer les archives des anciennes versions.

Comme le lien que vous avez fourni dans votre question suggère que private protected été utilisé sur un element/member d’une classe, lorsque vous voulez que votre subclasssubclass puisse accéder à l’élément tout en le gardant caché des autres classes de son package .

Java comparé à C++ a un concept supplémentaire d’encapsulation d’éléments – et c’est un package . Il faut également comprendre ce qui est accessible dans ou en dehors d’un paquet en Java quand il s’agit de ces spécificateurs d’access tels que private , public et protected .

S’il vous plaît noter que j’ai expliqué pourquoi il a été utilisé. Pas dans la version actuelle bien sûr

Non, vous ne pouvez pas utiliser les deux private protected ensemble. Votre tutoriel est étrange. Ce que vous faites est ce que l’on appelle un paquet privé ou dans un access protégé par paquet de 6 références. C’est l’access par défaut qui est activé quand aucun qualificatif acc6 n’est écrit explicitement.

La scope privée accompagne la classe existante. Où Protected peut être un access dans le package et la classe étendue par des classes dans d’autres packages.

De manière transparente, si vous souhaitez que vos variables / méthodes soient accessibles en dehors du package, vous devez définir comme protégés / publics sinon privés ou d’autres spécificateurs d’access.

Les méthodes protégées sont généralement accessibles à partir d’un paquet externe et à l’intérieur de sous-classes, c’est-à-dire qu’une classe doit étendre les classes respectives pour bénéficier des méthodes définies protégées.

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