IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Classe interne statique d'une classe interne


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 500
    Par défaut Classe interne statique d'une classe interne
    J'ai beau me creuser, je ne comprends pas la raison pour laquelle le code suivant ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A {
    	class B {
    		 static class C {
     
    		}
    	}
    }
    Je connais bien la règle qui dit qu'une classe statique ne peut être déclarée que dans une classe statique ou dans une top level classe. Mais c'est la raison d'être de cette règle qui m'échappe.

    Quelqu'un a une explication ? Ou mieux, un exemple qui montre clairement pourquoi ce ne serait pas possible ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Je ne comprends pas, à proprement parler, cette règle.
    Mais on peut aussi se demander pourquoi tu veux en faire une classe interne de B alors que ça pourrait tout aussi bien être une classe interne de A.

    Je suppose qu'on peut y voir une sorte de "propreté imposée", un peu comme l'obligation de déclarer certaines Exceptions, l'interdiction de déclarer une variable locale de même nom qu'une autre variable locale du scope au-dessus, la non-existence de goto ou l'interdiction du code mort.
    Bon, c'est pas évident, certes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 500
    Par défaut
    Je ne vois pas de propreté là dedans, au contraire.
    Si ma classe interne B est la seule à utiliser une classe "utilitaire" C, je ne vois pas ce que C irait faire dans A.

    C pourrait être typiquement un Comparator par exemple.

    Edit :

    Quant aux raisons qui me poussent à faire cela, elles sont juste théoriques

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Oui enfin, imbriquer d'imbriquer d'imbriquer d'imbriquer, ça va 5 minutes. Je suppose que c'est la, la "propreté imposée."

    Mais bon, des fois, les "propretés imposées" de Java échouent, c'est un fait. C'est rarement problématique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 500
    Par défaut
    Les autres "propretés imposées" ont une vraie raison d'être.

    Pour celles que tu cites :
    - obligation de déclarer certaines Exceptions : Fondement même de Java
    - interdiction de déclarer une variable locale de même nom qu'une autre variable locale du scope au-dessus : Celle du dessus est masquée et donc inaccessible.
    - non-existence de goto
    - l'interdiction du code mort : raison évidente. Aucune raison de faire quelque chose après un return.

    Un exemple un peu plus parlant, imaginé à l'arrache :
    Ceci fonctionne (compile en tout cas, c'est pas le résultat mais l'idée qui compte) :
    Une fenêtre qui a un listener qui souhaite conserver les clics qui se produisent trié par position horizontale du clic.
    Le listener possède donc un comparator.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class MaFenetre extends JFrame {
    	public MaFenetre() {
    		JPanel p = new JPanel();
    		p.addMouseListener(new MonListener());
     
    	}
     
    	private class MonListener extends MouseAdapter {
    		SortedSet<MouseEvent> events = new TreeSet<MouseEvent>(new EventComparator());
    		@Override
    		public void mouseClicked(MouseEvent e) {
    			events.add(e);
    		}
     
    		private class EventComparator implements Comparator<MouseEvent> {
    			@Override
    			public int compare(MouseEvent o1, MouseEvent o2) {
    				return o1.getX()-o2.getX();
    			}
    		}
    	}
    }
    Ce code me dérange.
    Pour moi, la classe EventComparator devrait être statique puisqu'elle ne dépend pas de l'instance de MonListener. Et je ne l'imagine pas en dehors du listener puisque c'est un outil de celui-ci.

    Ok, ce bout de code est pourri mais je ne trouve pas d'autre exemple.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par Satch Voir le message
    Les autres "propretés imposées" ont une vraie raison d'être.
    Celles que je t'ai citées oui, parce que je voulais des exemples parlants et légitimes. Mais Java est plein de choses de ce genre, et certaines sont gênantes de-ci de-là, quand on tombe dessus. Ce n'est pas à chaque coin de rue, bien sûr.

    Ce code me dérange.
    Pour moi, la classe EventComparator devrait être statique puisqu'elle ne dépend pas de l'instance de MonListener. Et je ne l'imagine pas en dehors du listener puisque c'est un outil de celui-ci.
    Moi ce qui me dérange, c'est l'idée que dans le code d'une seule classe, il puisse possiblement y avoir des choses qui ne la regardent pas.

    Pas que je serais outré si cette construction devenait possible, mais bon...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    J’ignore les raisons exact de tout cela, mais comme l'a indiqué thelvin l'objectif étant surement d'éviter de faire des truc pas très net

    Au passage cela ne se limite pas aux classes statiques mais à tous les éléments static (explicitement ou implicitement) :
    • Les méthodes static.
    • Les attributs static (sauf cas particulier pour les constantes).
    • Les interfaces/enums/annotations (qui sont implicitement static)


    Au passage cela ne me choque pas d'interdire de définir des éléments static dans un contexte non-static... C'est même plutôt logique en fait !

    Maintenant de mémoire j'ai rarement eu de problème avec cela... et ton exemple ne me convainc pas vraiment



    Citation Envoyé par Satch Voir le message
    - obligation de déclarer certaines Exceptions : Fondement même de Java
    Pourtant les checked-exceptions sont très décriés...


    a++

Discussions similaires

  1. Instance d'une classe fille à partir d'une classe mère
    Par Mathieu Salles dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 17/10/2012, 16h09
  2. Réponses: 6
    Dernier message: 14/12/2008, 02h12
  3. Réponses: 4
    Dernier message: 06/04/2008, 18h34
  4. Héritage d'une classe MFC et d'une classe non MFC
    Par Etienne Paquette dans le forum MFC
    Réponses: 7
    Dernier message: 04/12/2007, 20h19
  5. Réponses: 14
    Dernier message: 15/12/2005, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo