77 votes

Pourquoi n'est-il pas sous-classe modificateur de visibilité en Java?

Sur plus d'une occasion, j'ai trouvé moi-même désireux de visibilité des variables qui n'est pas possible en Java. Je voulais certains membres à être visible au sein de leur propre classe et dans les sous-classes, mais pas pour le reste de l'emballage ou du reste du monde. En d'autres termes, je voulais ce:

Modifier        Class     Package   Subclass  World
sub-class       Y         N         Y         N

Cependant, les concepteurs de Java seulement m'a donné ceci:

Modifier        Class     Package   Subclass  World
public          Y         Y         Y         Y
protected       Y         Y         Y         N
no modifier     Y         Y         N         N
private         Y         N         N         N

Le cas typique quand je veux quelque chose comme cela, c'est lors de la création d'une classe abstraite. Parfois, je trouve le résumé parent a besoin d'accéder à certains membres, mais le béton enfants de faire aussi bien. Je peux leur donner cet accès en faisant les membres de l' protected, mais qui s'ouvre à l'accessibilité pour le reste du paquet lorsque je n'ai pas vraiment envie.

Pour être totalement clair, j'en connais un modificateur est pas possible en Java. Ma question est pourquoi un modificateur pas inclus dans Java? Il me semble (à moi) à être plus naturelle, niveau de visibilité que soit protected ou la valeur par défaut. Est la raison vient le long des lignes n'étant pas suffisamment important pour être inclus, ou est-il plus liée à des effets secondaires possibles que je n'ai pas pris en compte?

20voto

Paŭlo Ebermann Points 35526

Je suppose qu'ils veulent éviter la complexité ajoutée par une non-linéaire de l'accès à la hiérarchie.

Vous devez garder le contrôle de votre colis, il suffit de ne pas appeler ces protégés méthodes.

(En passant, protected n'est pas tout à fait la même que sub-class and package, non-statiques les méthodes protected (si pas dans le même paquet) ne peut pas être appelé arbitraire et les objets de la classe de déclaration, mais seulement sur les objets de la sous-classe le code est dans. (Vous pouvez le voir sur Object.clone(), ce qui ne peut être appelée que par la classe dont l'objet est d'être cloné.))

9voto

aioobe Points 158466

Apparemment, ils considèrent être un sous-type de pas de "lien étroit" comme être-en-même-paquet-de. Et pour le modificateur de vous suggérer, il ne serait pas très différent de la protected moins que la sous-classe sont en fait un paquet différent, et je dirais, que d'être dans le même paquet, doit être considérée comme une relation plus étroite, que d'être une sous-classe dans un tout autre package.

3voto

Tiberiu Rogojan Points 177

Vous devriez mettre votre classe dans un package de son propre et marque le membre(variable d'instance ou de la méthode) comme protégés. De cette façon, pas les autres classes, à l'exception de la sous-classes peuvent accéder à ce membre qui vous marché protégé. Vous allez vous retrouver avec une classe dans un package, si vous voulez désespérément seuls les sous-classes à l'accès que les membres protégés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X