web-dev-qa-db-fra.com

Est-ce que Java a un modificateur d'accès "protégé privé"?

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

private protected someMethod() {

}

Une des pages que j'ai trouvées en référence à ceci 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 entraîne toutefois 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 ça n'existe pas, mais je veux une explication de ce qui s'est passé. At-il été considéré, 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 mot clé protected.

160
user6754053

Suppression du modificateur d'accès

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

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

Un autre réponse sur SoftwareEngineering.SE indique:

Java avait à l'origine un tel modificateur. C'était écrit private protected mais supprimé dans Java 1.0.

Jetez maintenant un coup d’œil sur = Historique des versions 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.

À partir de là, nous pouvons conclure que les tutoriels relatifs à 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 faisait 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. , vous ne le trouverez pas car, comme mentionné précédemment, il a été supprimé du JDK 1.0.2, autrement dit Java 1.0. 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, quand private protected a été retiré, a été libéré après février 1996, et conformément au cahier des charges, en août 1996.

Raison de l'enlèvement

Certaines sources expliquent également la raison de private protected, tel que this un. 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. Le sens 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 modificateur protected a été modifiée dans la version bêta2 de Java et le paramètre private protected _ La combinaison est apparue au même moment. Ils ont corrigé certaines failles de sécurité potentielles, mais ont dérouté de nombreuses personnes.

Et SoftwareEngineering.SE le soutient également 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 de Oak, les deux ont été autorisés à coexister (d'où la combinaison). Puisque la signification de protected a changé1, il était peut-être nécessaire d'autoriser private et protected en même temps. L'introduction est devenue trop complexe et ne valait pas la peine, et a donc été abandonnée à la fin. Au moment Java 1.0/JDK 1.0.2 roulé, il avait été supprimé et ne pouvait donc pas être trouvé dans la documentation.


1Dans le 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'accès au paquet par défaut. Cela a peut-être ouvert la voie à la nécessité de private protected, car private était trop restrictif et protected trop indulgent.

191
Li357

Il y a des histoires confuses/peu claires:

L’un des sources de Princeton que vous avez mises, ainsi que de archives du MIT , indique 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 la protection privée. 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 dans aucune documentation officielle pour Java 1.0 ici ou ici .

Je suppose que cette fonctionnalité n’a pas été intégrée à la version officielle 1.0, car 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 sur Oracle pour la suppression des archives des versions antérieures.

52
m0skit0

Comme le suggère le lien que vous avez fourni dans votre question, private protected A été utilisé sur un element/member D'une classe, lorsque vous voulez que votre subclass puisse accéder à l'élément tout en le masquant. d'autres classes dans sa package.

Java si on le compare à C++ a un concept supplémentaire d’encapsulation des éléments - c’est un Package. Il faut également comprendre ce qui est accessible à l'intérieur ou à l'extérieur d'un paquet dans Java en ce qui concerne ces spécificateurs d'accès 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 du cours

11
Game_Of_Threads

Non, vous ne pouvez pas utiliser les deux private a protected ensemble. Votre tutoriel est étrange. Ce que vous avez est appelé paquet privé ou, dans les références ot6, accès protégé au paquet. C'est l'accès par défaut qui est activé quand aucun qualificatif acc6 n'est écrit explicitement.

0
AlexR