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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    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 : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    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.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    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 Expert
    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 : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    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 ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 Expert
    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 : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    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é...

  6. #6
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    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 326
    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 Expert
    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 : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    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)

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