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 :

Eviter un cast


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Eviter un cast
    Bonjour,

    Tout d'abord, je n'aime pas les casts. : )

    Une solution peut-être pas très propre me vient à l'esprit pour des petits trucs isolés.

    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
     
    class A {
      B asB(){
         throw new IllegalStateException("Bad Type");
      }
      C asC(){
         throw new IllegalStateException("Bad Type");
      }
    }
     
    class B extends A {
      final B asB(){
        return this;
      }
    }
     
    class C extends A {
      final C asC(){
        return this;
      }
    }
    En gros ça remplace le check pour le cast par un appel de méthode. Et surtout il n'y a pas de cast dans mon code.

    Est-ce que quelqu'un sait si c'est fort différent au runtime finalement?

    Merci : )

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 32
    Points
    32
    Par défaut
    Mon petit doigt me dit que le cast doit être un peu plus lent au runtime, à cause de la vérification de type, qui me semble plus couteuse qu'une invocation virtuelle. Mais cela n'engage que mon petit doigt, pas moi. Et puis, la différence doit être très faible.

    En revanche, la technique n'est applicable que si la classe mère appartient à un même lot de développement que toutes ses classes filles, ce qui n'est pas la règle générale. Un développeur étends souvent des classes dont il n'a pas la maitrise. A commencer par Object : si on a une variable Object, pas de "as".

    Avec les interfaces, ça me semble inapplicable car cela multiplie le nombre de méthodes "as" à prévoir sur les interface à succès.

    Bref ... mieux vaut bien utiliser les types génériques et accepter quelques cast ici et là.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ayjdev Voir le message
    En gros ça remplace le check pour le cast par un appel de méthode. Et surtout il n'y a pas de cast dans mon code.

    Est-ce que quelqu'un sait si c'est fort différent au runtime finalement?
    C'est complètement différent.
    • C'est contre intuitif, les autres dev de l'équipe n'utiliseront jamais cette méthode et feront un simple cast quand c'est nécessiare.
    • C'est une belle erreur de design: A doit connaitre ses fille, ce qui est contraire aux concepts orienté objet.
    • Avec cast vous pouvez tester avant le cast si c'est possible, via instanceof
    • Avec votre code, on est en droit d'attendre que X.asA() mette tout en oeuvre pour convertir un X en un A, quitte à créer une nouvelle instance. Une fille pourrait même le faire. alors qu'avec un cast on a la garantie de rester sur la même instance.
    • Le compilateur peux vous dire qu'un cast est impossible, il ne pourra pas vous dire qu'un appel à asX ne l'est pas. Exemple:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      B b= .....;
      C c1 = b.asC(); // compile
      C c2 = (C)b; // erreur de compilation: B ne pourra jamais être typecasté en C
    • Si vous voulez limiter le nombre de cast et avoir des garanties sur le type, c'est pour cette raison qu'on a créé les Generics
    • Votre code n'apporte rien puisque, vous transformez une Exception en une autre, le problème reste complet à l'exécution
    • C'est impraticable sur des grosses hiérarchies d'objets
    • Le cast, c'est vérifié par la JVM rapidement. Un appel à une méthode virtuelle nécessite la consultation de la table des méthodes virtuelles, ce qui implique déjà une vérification sur le type de l'instance. C'est donc au moins plus long

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ton dernier point m'a convaincu.

    Pour les autres, je pars du principe que si la documentation est lue, ce n'est pas vraiment un problème, tant que les responsabilités sont bien définies.

    Mais je me disais que si la visibilité est bien réduite, avec ces méthodes finalisées, il y avait des chances que le compilateur 'inline' l'appel et que donc au final c'est plus rapide qu'un cast.

    Mon seul objectif est la rapidité.

    merci

    edit: c'est une situation où il n'est pas possible d'utiliser les generics.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    vous faites ce que vous voulez, je ne suis pas là pour prendre les décisions à votre place. C'est du code de cochon ça, et je vous ai expliqué pourquoi.

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ayjdev Voir le message
    Mon seul objectif est la rapidité.
    Un bon conseil : changes d'objectif !

    Ton objectif devrait être de bien penser ta modélisation objet et d'utiliser des algorithme propre et clair !

    Ici tu es en train de faire des trucs sales pour tenter de gagner une demi-nanosecondes par-ci par là (et encore ce n'est même pas sûr).


    a++

Discussions similaires

  1. Eviter le cast d'un accesseur
    Par MeTaLCaM dans le forum C#
    Réponses: 5
    Dernier message: 15/12/2009, 17h01
  2. Eviter les class cast ?
    Par sbrisard dans le forum Langage
    Réponses: 5
    Dernier message: 22/04/2008, 16h47
  3. eviter un warning sur un cast
    Par r0d dans le forum C++
    Réponses: 19
    Dernier message: 14/06/2007, 11h53
  4. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  5. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57

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