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 :

[Java 8] default method: pas de final possible


Sujet :

Langage Java

  1. #1
    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 [Java 8] default method: pas de final possible
    Bonjour,

    Dans la découverte de Java 8, je constate que dans une interface il est impossible de définir une méthode qui soit à la fois default et final.

    Pourtant, j'aurais aimé pouvoir définir une méthode qui ne soit pas redéfinissable mais injectée dans toutes les classes qui implémentent l'interface.
    Apparemment il y a contradiction...

    Je ne vois pas très clairement le raisonnement (j'ai juste quelques soupçons).

    Quelqu'un saurait-il m'expliquer cela ?

    Merci d'avance.
    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)

  2. #2
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Le principe des méthodes par défaut dans les interfaces, c'est de permettre de fournir une implémentation pour les nouvelles méthodes lorsque l'on fait évoluer une interface. Mais ça reste une interface, dont la classe qui l'implémente doit pouvoir fournir sa propre implémentation. C'est en tout cas dans ce but, me semble t il, que les implémentations par défaut ont été mise en place...

    Ce qui explique le fait que les mots clés default et final ne serait pas compatible.

  3. #3
    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
    Citation Envoyé par benratti Voir le message
    Ce qui explique le fait que les mots clés default et final ne serait pas compatible.
    euH? pas convaincu ... un autre argument ?
    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)

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Autant je comprends le besoin d'une méthode qui ne soit pas redéfinissable, mais fournie avec une interface, comme on l'aurait fait avant dans une classe utilitaire séparée,
    Autant quand on voit default l'existence du même truc "pas par défaut" tombe un peu sous le sens, quand même -_-°.

    Je dirais que permettre ça remettrait sur la table le délicat problème de l'héritage multiple, que faire si deux interfaces proposent la même méthode, et qu'aucune des deux n'autorise sa redéfinition ?
    (En fait concrètement, c'est quoi exactement le cheminement, pour vouloir implémenter une méthode dans une interface, mais ne surtout pas vouloir qu'elle soit ré-implémentée par autre chose ? Avec des classes je comprends, 'faut pas toucher aux invariants. Mais avec une interface...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    ça se tient.
    Mais mon interrogation venait de l'histoire de mon code:
    - j'ai des composants complexes qui ont une méthode final (et elle doit l'être!)
    - pour ceux qui voulaient des composants analogues avec moins de fonctionalités j'avais une interface à implanter
    - avec java 8 je fais "remonter" pas mal de méthode du composant complexe à l'interface (c'est possible)
    mais voilà: la méthode 'final' a tout ce qu'il faut pour être intégrée à l'interface .... sauf qu'elle est final !
    dont glissement sémantique: les méthodes default de l'interface étaient là pour implanter des comportements pre-cablés dans les classes ...
    la frontière entre le sens de l'interface et l'implantation automatiques étant ténues .... j'ai un peu tiqué...
    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)

  6. #6
    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
    A la base, toutes les méthodes d'une interfaces existent pour qu'on puisse les redéfinir, c'est la définition même que donnent les enseignants : "Une interface décrit une capacité, ce qui se traduit par des méthodes à implémenter".

    Avec Java 8 tu peux certes avoir des méthodes par défaut que tu pourras redéfinir, des méthodes static que tu ne pourras pas redéfinir, mais tout ça c'est du bonus. Sinon tu peux toujours utiliser une classe abstraite pour réaliser ton besoin.
    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

  7. #7
    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
    oui certes ... encore une fois j'ai attribué indûment aux nouvelles interfaces des propriétés des "traits"
    en Groovy par exemple une méthode de trait peut-être final
    les effets en Groovy n'en sont toutefois pas simples à prévoir.
    la lecture des specs java n'est pas claire, claire sur ce double aspect contrat d'interface/code par défaut.
    (le rejet de final est dans la description syntaxique uniquement)
    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)

  8. #8
    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,


    Il y a une réponse assez complète de Brian Goetz ici : http://stackoverflow.com/questions/2...76994#23476994

    Il rappelle en particulier que les méthodes par défaut n'ont pas pour objectif de transformer les interfaces en Traits, mais seulement de permettre l'évolution des interfaces.



    a++

  9. #9
    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
    j'étais justement en train de lire cette discussion: le point de Brian Goetz est convaincant.
    un des arguments aussi qu'on a tendance à oublier dans les discussions: que se passe t'il en cas d'évolution d'un code déjà publié!
    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)

  10. #10
    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
    Citation Envoyé par professeur shadoko Voir le message
    j'étais justement en train de lire cette discussion: le point de Brian Goetz est convaincant.
    un des arguments aussi qu'on a tendance à oublier dans les discussions: que se passe t'il en cas d'évolution d'un code déjà publié!
    Perso je suis de temps en temps certaines discussion sur les mailings list de java.
    Ils y a vraiment beaucoup de choses qui sont prise en considération, notamment sur les effets indésirables que cela peut entrainer, ou sur les limitations futures que cela pourraient entrainer.

    Au final on peut avoir l'impression que le langage évolue peu ou lentement, mais chaque décision me semble pensée et réfléchie.


    a++

  11. #11
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il y a une réponse assez complète de Brian Goetz ici : http://stackoverflow.com/questions/2...76994#23476994

    Il rappelle en particulier que les méthodes par défaut n'ont pas pour objectif de transformer les interfaces en Traits, mais seulement de permettre l'évolution des interfaces.
    Pour le coup Java est un peu coupable d'avoir permis d'implémenter directement des méthodes dans l'interface. Résultat les interfaces sont persques des trait mais pas totalement. Les première idées avaient le mértie de ne pas laisser de doute sur le but des methodes par défaut.

  12. #12
    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
    Citation Envoyé par Uther Voir le message
    Les première idées avaient le mértie de ne pas laisser de doute sur le but des methodes par défaut.
    De quelles premières idées parles-tu ?


    Sinon oui les default-methods ne sont pas des Traits, même s'ils peuvent être utilisé dans des objectifs similaires.
    La principale différence vient du fait que même s'il y a du code, il n'y a toujours pas d'état dans les interfaces.
    Toutes les méthodes par défaut doivent se baser uniquement sur le contrat de l'interface dans laquelle elles sont définies...


    a++

  13. #13
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    Si je me souviens bien, au début, plutot que de définir les implémentations des méthodes par défaut à l'interieur de l'interface, il était question de faire pointer ces méthodes sur des méthode statiques.
    Même si au final ca ne changeait pas grand chose du point de vue des possibilités techniques, ça réduisait ce risque de confusion.

  14. #14
    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
    Ah oui en effet mais c'est avant tout une question de syntaxe. Cela n'aurait rien changé d'un point de vue possibilités.
    C'est juste qu'il aurait fallut écrire une classes d'utilitaires static en plus, et en simulant le this en premier paramètre...

    Bref cela aurait juste été un peu plus lourd à écrire...


    a++

  15. #15
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    En effet techniquement, ça ne réduit pas les possibilités, mais je pense que le fait de séparer l'implémentation de l'interface aurait certainement aidé a comprendre que le but n'est pas de transformer les interfaces en Trait.

  16. #16
    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
    Mais cela ne l'aurait pas empêché pour autant. Donc autant privilégié une syntaxe claire et précise pour ceux qui l'utiliseront correctement
    Exemple avec les extension-methode de C# : http://newtocode.wordpress.com/2014/...aits-in-c-3-0/


    J'ai vu passer d'autre article qui indique comment faire des "Traits" en Java, en gérant un état via des Map en static ! (vas-y la méchante fuite mémoire - sans parler du fait que ce n'est pas thread-safe du tout).
    Celui-là par exemple : http://kerflyn.wordpress.com/2012/07...u-have-mixins/


    Bref y'aura toujours des mauvaises pratiques, quelque soit le langage


    a++

  17. #17
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    C'est exactement ce que je dit le coté monobloc de la syntaxe a poussé les gens a croire que l'on avait un vrai système de Trait/Mixin, alors que le but a la base était seulement de permettre d'étendre les interface sans casser la compatibilité antérieure.

    Je ne dis pas qu'il n'y aurait pas eu de grands malade qui auraient préconisé la même chose que ton arcticle en recourant en plus a des méthodes statiques, mais franchement, avec la complexité supplémentaire, je ne pense pas que grand monde aurait considéré ça autrement qu'un hack marant mais trop sale a utiliser.

  18. #18
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par Uther Voir le message
    C'est exactement ce que je dit le coté monobloc de la syntaxe a poussé les gens a croire que l'on avait un vrai système de Trait/Mixin, alors que le but a la base était seulement de permettre d'étendre les interface sans casser la compatibilité antérieure.
    Sérieusement ? Une classe aussi c'est monobloc, et les interfaces l'étaient déjà avant les default methods et les static methods.
    Et elles passaient pas pour des traits ou mixins, mais maintenant si ?

    Il y a vraiment plein de gens qui ont halluciné ça ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    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
    Les méthodes par défaut peuvent être utilisées pour faire une sorte d'héritage multiple, et certains font le raccourci vers les Traits...

    C'est complètement erroné et ce n'est pas du tout l'objectif des méthodes par défaut, mais le rapprochement est souvent fait...


    a++

  20. #20
    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
    Citation Envoyé par adiGuba Voir le message
    Celui-là par exemple : http://kerflyn.wordpress.com/2012/07...u-have-mixins/
    Bref y'aura toujours des mauvaises pratiques, quelque soit le langage
    par contre dans l'article il y a une référence au "virtual field pattern": je l'utilisais déjà pas mal mais là les méthodes par défaut d'interface ont complétement chamboulé certains codes en me permettant un transfert massif
    de fonctionnalités d'une classe vers une interface (les seules méthodes abstraites de l'interface font référence au get/set du champ virtuel qui apporte les fonctionnalités)
    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)

Discussions similaires

  1. [Java 8+] A propos des 'default' methodes
    Par 0xNoob dans le forum Langage
    Réponses: 7
    Dernier message: 22/05/2014, 22h47
  2. pb java avec les methodes natives
    Par sly0510 dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2006, 06h52
  3. Applet java qui ne marche pas sous opéra, pourquoi ?
    Par WeDgEMasTeR dans le forum Applets
    Réponses: 2
    Dernier message: 17/05/2006, 00h23
  4. [java][KeyListener]j'arrive pas a obtenir le focus au debu
    Par bodygard dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/01/2006, 15h27
  5. Inclure une DLL dans le .exe final?? possible?
    Par xavmax dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2005, 17h00

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