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

Java Discussion :

Classe static interne en java


Sujet :

Java

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 066
    Points : 2 569
    Points
    2 569
    Par défaut Classe static interne en java
    Bonjour,

    On m'a demandé en entretien à quoi servait une "class interne static en Java".

    Je n'ai pas su répondre.

    Une classe static ne pourra que accéder aux membres static et au contexte static de sa classe mère enveloppante.
    Mais à quoi ça sert ?

    Les cours sur le web ne détail pas trop.

    Si vous les utilisées, pouvez vous me donner des exemples, en quoi ça aide ?

    Merci si vous pouvez faire avancer mon Schmilblick

    Cordialement
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    ça sert à pas avoir besoin d'une instance de la classe englobante. Tout comme pour les méthodes static et les champs static.

    Cela dit, ça n'apporte pas grand-chose par rapport à juste faire une autre classe à côté. L'utilité des classes imbriquées static ne va pas loin. C'est juste qu'on peut les ranger dans la classe qui les contient. Éventuellement, ça peut permettre de les garder private et donc inconnues du reste du programme.

    (Au passage, en nomenclature officielle, une "intern class" n'est pas static. C'est comme ça qu'on appelle une classe imbriquée qui n'est pas static. Une "nested class" peut l'être.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 066
    Points : 2 569
    Points
    2 569
    Par défaut
    Bonjour,

    Merci de ton aide.
    Mais si je ne me sents pas plus avancé.

    J'ai quand même l'impression que ça ne sert pas à grand chose, ou a se compliquer la vie, ou à piéger les candidats en entretien.

    A moins que ça leurs sert dans un but préçis

    Cordialement
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par CoderInTheDark Voir le message
    A moins que ça leurs sert dans un but préçis
    @thelvin te l'a dit c'est conceptuel. 1 classe imbriquée permet d’être liée à 1 autre classe - parce qu'à chaque fois tu dois faire référence à la classe parente. C'est de la composition de classe en quelque sort.

    Alors oui, niveau programmation, on s'en tamponne 1 peu limite c'est comme 1 espace de noms, cela devient vite pénible.
    Quoique
    • on a l'encapsulation
    • 1 classe imbriquée peut avoir accès aux membres de la classe parente (<- d'après ce que j'ai vu en Java sur Internet)



    Ensuite la notion de statique, c'est comme ailleurs : 1 seule instance, pas d'allocation et accès uniquement aux membres et méthodes statiques.

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 066
    Points : 2 569
    Points
    2 569
    Par défaut
    Citation Envoyé par foetus Voir le message
    @thelvin te l'a dit c'est conceptuel.
    Keep cooll, pose ton clavier on peut discuter calmement

    Je trouve juste que ça ne semble pas plus claire et que j'aurai pu continuer à vivre en l'ignorant.
    Ce n'est pas un concept que je pense utiliser prochainement

    Surtout qu'on m'a enseigner que la programmation statitc était parfois mal, c'était du procédural déguisé.
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 066
    Points : 2 569
    Points
    2 569
    Par défaut
    Au final on met quoi en "static".

    Des constantes globales
    private static final float pi = 3.14;

    Des ressources à instancier qu'une fois, le "logger" par exemple
    private static Log log = LogFactory.getLog(tropLaClasse.class);

    Ce qui est un peu un singleton bas de gamme.

    A ce propose certain parle du "singleton" comme premier design pattern.
    Mais faire un singleton propre n'est pas si facile.
    Surtout dans un contexte très concurentiel.
    Il en va de même pour le multiton

    Et je fais parfois des méthodes "static" utilitaires qui ne requiert pas d'instance pour fonctionner.
    Un peu comme
    Integer.parseInt("123");
    Je crois qu'on a fait le tour de la question
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Bon, je n'ai pas d'exemple pertinent à te donner mais je dirais que dans l'absolu, une classe sert à définir des propriétés et des méthodes, alors pourquoi ne pas utiliser des classes static internes pour structurer de l'information.
    Finalement, le fait que ce soit static ne veut dire qu'une seule chose, c'est lié à la classe et non pas à une instance.
    Si on voulait partager des valeurs structurées, dans une classe utilitaire par exemple, ce serait une solution.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 066
    Points : 2 569
    Points
    2 569
    Par défaut
    Bon si je résume c'est une façon d'organiser son code.
    ca peut permettre de faire du code utilitaire static.

    C'est comme beaucoup de concept c'est bien de savoir que ça existe, on est bien content de s'en rappeler quand on en a besoin.
    Mais ça ne pas si courant au final
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    En gros oui... je programme en java depuis l'an 2000 et je n'ai jamais utilisé une classe interne static... ou alors j'ai oublié... vu mon âge, c'est possible
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 066
    Points : 2 569
    Points
    2 569
    Par défaut
    "La culture, c'est ce qui demeure dans l'homme lorsqu'il a tout oublié"
    Edouard Herriot.

    On peut conclure que les classe internes peuvent être oubliées, elles ne sont pas fondamentales dans la culture d'un développeur Java
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  11. #11
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    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
     
    public class Client implements Comparable<Client>{
       private String id ;
       //autres champs
       private BigDecimal totalDesAvoirs ;
     
       // comparaison idiote ... c'est juste pour l'exemple
       public int compareTo(Client autre) {
          return this.id.compareTo(autre.id) ;
       }
     
       // static "nested"  class
       // a accès aux données marquées +private+
    public static class ComparateurParRichesse implements Comparator<Client> {
          public int compare(Client c1, Client c2 ){
             return c1.totalDesAvoirs.compareTo(c2.totalDesAvoirs) ;
          }
       }
    }
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  12. #12
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Salut @CoderInTheDark ,

    Une "class interne static en Java" comme son nom l'indique, n'est ni plus ni moins une classe que tu définies à l'intérieur d'une autre classe.
    C'est un concept que certains langages de programmation tels que Java intègrent, mais que d'autres comme PHP ou JavaScript n'intègrent pas (du moins pas nativement).
    C'est un concept qui peut présenter un intérêt mais qui n'est pas primordial, on peut s'en passer.

    La question que l'on peut donc se poser est quand est-il utile d'utiliser ce concept ? Considère que tu développes une classe A, cette classe possède des champs x, y, z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class A {
        int x, y, z;
    }
    Cette classe A possède un constructeur par défaut, tu peux donc l'instancier avec un A a = new A(), voire même A a = new A(1, 2, 3) si tu implémentes ton propre constructeur. Mais si tu considères que le constructeur réalise de nombreuses opérations pour construire l'objet de type A, tu vas surement souhaiter rendre son constructeur privé et passer par une autre classe pour le créer, en utilisant le pattern builder très certainement, ce qui ressemblera à ceci : A a = new BuilderForClassA().x(1).y(2).z(3).build(), l'exemple ici est très simpliste mais tu peux déjà imaginer que la méthode build() réalise de nombreux contrôles avant de chercher à retourner un objet de type A. Jusque là rien de bien compliqué, mais on peut se dire que la classe BuilderForClassA n'est utile que pour la classe A et aucune autre classe du projet, tu peux alors la déplacer dans ta classe A et utiliser la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Sans classe interne
    A a = new BuilderForClassA().x(1).y(2).z(3).build();
     
    // Avec classe interne, la méthode static builder() retourne new BuilderForClassA() 
    A a = A.builder().x(1).y(2).z(3).build();
    Quelques subtilités :
    • Une classe interne peut ne pas être static, la différence est négligeable, tu seras juste obligé d'instancier la classe qui englobe la classe interne (la classe A dans l'exemple) si tu souhaites pouvoir utiliser ta classe interne.
    • Ta classe interne peut être public, c'est utile si tu souhaites que ton Builder soit visible dans d'autres packages. Ta classe interne peut être private, et dans ce cas uniquement utilisable dans ta classe A, tu peux t'en servir comme classe pour factoriser ton code même si généralement on se sert de méthode private pour cela.



    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Info]Classe anonyme - interne
    Par thibaut dans le forum Langage
    Réponses: 8
    Dernier message: 31/08/2006, 13h18
  2. Réponses: 15
    Dernier message: 06/04/2006, 12h05
  3. Réponses: 10
    Dernier message: 10/01/2006, 14h14
  4. [Info] variable d'une classe static
    Par romdelf dans le forum Langage
    Réponses: 21
    Dernier message: 06/12/2005, 15h08
  5. Pb accès entre 2 classes static
    Par d.w.d dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 19h05

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