Pourquoi intérieure privée membre de la classe public en Java?
Quelle est la raison de la déclaration d'un membre de l'une intérieure privée publique de la classe en Java, si elle ne peut toujours pas être accessible à l'extérieur du contenant de la classe? Ou peut-il?
public class DataStructure {
//...
private class InnerEvenIterator {
//...
public boolean hasNext() { //Why public?
//...
}
}
}
Vous devez vous connecter pour publier un commentaire.
Si le
InnerEvenIterator
classe ne s'étend pas à toute la classe ou de mettre en œuvre n'importe quelle interface, je pense que c'est un non-sens car aucune autre classe ne peut accéder à aucune instance.Toutefois, si elle s'étend ou de mettre en œuvre tout autre non privé de la classe ou de l'interface, c'est logique. Un exemple:
Cette méthode peut être faite
public
pour indiquer qu'il est sémantiquement public, malgré le fait que le compilateur ne pas appliquer les règles de visibilité dans ce cas particulier.Imaginez que, pendant quelques refontes vous avez besoin pour faire de cette intérieure de la classe de niveau supérieur. Si cette méthode est
private
, comment voulez-vous décider si elle doit être faitepublic
, ou certains plus restrictive modificateur doit être utilisé? Déclarant méthodepublic
raconte lecteur sur les intentions de l'auteur d'origine - cette méthode ne devrait pas être considéré comme un détail d'implémentation.Il est utile lorsque vous mettez en œuvre les
interface
.Je pense que vous êtes absent de la mise en œuvre de la
Iterator
partie interface dans votre exemple de code. Dans ce cas, vous ne peut pas faire lahasNext()
méthode avez d'autres visibilité identifiant autre que public depuis que ce serait la fin de réduire sa visibilité (méthodes d'interface ont une visibilité publique) et il ne compile pas.Il existe de nombreuses combinaisons de modificateurs d'accès qui ne sont pas utiles. Une méthode publique dans un privée intérieure n'est utile que si elle met en œuvre une méthode publique dans une classe publique/interface.
BTW: les classes abstraites ont souvent
public
constructeurs alors qu'en réalité, ils sontprotected
public
n'est pas utile si elle ne peut pas être consultépublic
ly et pourrait induire en erreur ou de confusion.Si l'intérieur de la classe est privé, il ne peut être accessible par un nom en dehors de l'extérieur de la classe. Intérieure et extérieure classes ont accès à chacune des autres méthodes privées et privées, les variables d'instance. Tant que vous êtes à l'intérieur ou à l'extérieur de la classe, les modificateurs public et privé ont le même effet. Dans votre exemple de code:
Autant que la classe Discbased est concernée, ce qui est complètement équivalent à:
C'est parce qu'Discbased peut y accéder, de sorte qu'il n'a pas d'importance si vous la définissez, public ou privé. De toute façon, Discbased est encore la seule classe qui peut y accéder. Utilisation selon modificateur que vous aimez, il ne fait aucune différence fonctionnelle. Le seul moment où vous ne pouvez pas choisir au hasard, c'est quand vous êtes à la mise en œuvre ou de l'extension, dans ce cas, vous ne pouvez pas réduire l'accès, mais vous pouvez l'augmenter. Donc, si une méthode abstraite a un accès protégé vous pouvez le modifier à tout public. Accordé ni réellement fait une différence.
Si vous prévoyez sur l'utilisation d'un intérieur de classe dans d'autres classes, et donc de la rendre publique, vous ne devriez pas faire un intérieur de classe à la première place.
En outre, je ne vois aucune exigence pour les classes internes l'extension ou la mise en œuvre des autres classes. Il peut être commun pour eux de le faire, mais c'est certainement pas nécessaire.
private
etpublic
dans ce cas: non privé méthodes peuvent être remplacées par une autre intérieure, tandis que celles du secteur privé sont pas.