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 :

Utilisation de l'instruction instanceof


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2006
    Messages : 194
    Points : 69
    Points
    69
    Par défaut Utilisation de l'instruction instanceof
    bonjour tous le monde,
    Je vais savoir dans quel cas on doit utiliser l'instruction instanceof et quel est son utilité
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(français instanceof européen){
    faireQulequechoz();
    }
    Merci

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Cela permet de savoir si un objet est d'une instance donnée.

    Par exemple dans le cas de l'héritage tu pourrais avoir quelque chose du type:

    Vehicule
    aller_a

    ^
    |

    Avion Voiture
    voler rouler

    Regardes le bout de code suivant (il ne compile sans doute pas):
    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
     
    class Vehicule { public void allerA(){} }
    class Voiture extends Vehicule { public void rouler(){} }
    class Avion extends Vehicule { public void voler(){} }
     
    static void main (String[] args) {
       Vehicule v1 = new Avion();
       Vehicule v2 = new Voiture();
       //La ligne suivant marche toujours
       v1.allerA();
     
       //Mais la ligne suivante ne marche que dans le cas d'une Voiture
       v2.rouler();
       //Pour être sur
       if (v1 instanceof Avion) {
          v1.voler();
       }
       //Pour être sur-->Faux
       if (v2 instanceof Voiture {
          v2.rouler();
       }
    }

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Points : 267
    Points
    267
    Par défaut
    Salut,

    Je ne pense pas que cet exemple soit bon, dans ce cas la il vaut mieu créer une méthode abstraite 'allerA' et la redéfinir dans chacune des classes filles.

    a+

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Effectivement, mais il y a peu de "bons" exemples d'utilisation de instanceof.

    Si on a un code qui a besoin de l'utiliser, le réflexe est de vérifier la conception de son application car dans la majorité des cas, on peut contourner le problème d'une jolie façon en utilisant l'héritage et le polymorphisme

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Un exemple plus concret si tu veux :

    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
    23
    24
    25
     
    public class MonObject {
    public boolean equals(Object o){
     
    // vérification que l'object passé en parametre est du meme type que MonObject
     
     
        if(!(o instanceof MonObject)) return false;
     
    // On est sur que o est de type MonObject 
     
         MonObject obj = (MonObject) o;
     
    // Serie de if sur les differentes propriete 
    // pour vérifier que tout est le même
         if(!obj.getNom().equals(.getNom())) return false;
         if(!obj.getDescription().equals(.getDescription())) return false;
     
        // Si tout les test on réussi, alors c'est le meme object
        return true;
     
     
      }
     
    }
    Voila un exemple de l'utilisation de instance of

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    On peut imaginer une multitude d'utilisations...
    Supposons :

    Une classe abstraite Champ représentant des méthodes et propriétés communes à un champ DB

    Une classe ChampInteger étendant Champ
    Une classe ChampDate étendant Champ
    etc...

    Dans un traitement donné, tu récupères un objet Champ et tu veux en fonction du type afficher un message... (genre "La valeur de l'entier est " + laValeur)
    Là, instanceof va te permettre de savoir de quel type est l'instance de l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Champ unChamp = maTable.mesChamps.get(i);
    if ( unChamp instanceof ChampInteger )
    {
       msgType = " de l'entier ";
    }
    else ...
    (ça n'est qu'un exemple...)

    A+

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Points : 267
    Points
    267
    Par défaut
    Salut,

    +1 avec l'exemple de Hikage,
    Je l'utilise à tout les coups pour le equals

    a+

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    D'autres cas typiques d'utilisation : dans le code des cell renderer/editor des composants Swing lorsque le composant complexe (JComboBox, JList, JTree, ...) contient des donnees heterogenes (la JTable permet elle de specifier un renderer/editor par classe, ce qui permet en general d'eviter le probleme).

    Dans des cas plus complexe, l'heritage ne resoud pas toujours tous les problemes et va parfois a l'encontre d'une conception/modelisation correcte avec separation des tiers/taches/couches de conception.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Points : 151
    Points
    151
    Par défaut
    Salut,
    Puisque la discussion est encore ouverte j'aimerais apportté ma contribution sur l'utilisation de instance of (un operateur de transtypage).

    J'ai remarqué que dans bien des cas on est bien forcé de l'utiliser.
    La morale en est que si on l'utilise plusieurs fois dans son code alors il faut croire que il y a un problème de conception.
    C'est l'occasion alors de remettre sa conception à jour.

  10. #10
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 317
    Points
    317
    Par défaut
    Bonjour,

    Je me permets de remonter le sujet pour demander s'il y a une différence notable en terme de temps d'exécution/calcul, entre le fait de faire un joli polymorphisme et l'utilisation du instanceof tout moche.

    Merci !

  11. #11
    Membre régulier
    Homme Profil pro
    Nom
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Nom

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Points : 89
    Points
    89
    Par défaut InstanceOf Vs Visitor
    Pour ma part, je banni l'instanceOf dans le cas où le nombre de traitement est superieur à 1.
    Je m'explique:

    si le code s'apparente à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ( monObjet instanceOf MonType){
       ...
    }
    je considère dans ce cas que le instanceOf a sa place, en revanche,
    pour les cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if ( monObjet instanceOf MonType1){
       ...
    } else {
    if ( monObjet instanceOf MonType2){
       ...
    } else {
    if ( monObjet instanceOf MonType3){
       ...
    } else {
     
    } }  }
    je préconise largement l'utilisation des visiteurs.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/01/2009, 18h34
  2. Utilisation de l'instruction "uses"
    Par LuckyLuke56 dans le forum Outils
    Réponses: 2
    Dernier message: 05/08/2008, 23h52
  3. Réponses: 1
    Dernier message: 30/05/2008, 15h52
  4. Utilisation de l'instruction UNION
    Par aloha dans le forum JPA
    Réponses: 3
    Dernier message: 28/04/2008, 21h13
  5. [XI] Utilisation de l'instruction IIF
    Par tatayoyo dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 28/03/2007, 15h20

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