Pourquoi le “final” n'est pas autorisé dans Java 8 méthodes d'interface?

L'une des caractéristiques les plus utiles de Java 8 sont les nouveaux default méthodes sur les interfaces. Il y a essentiellement deux raisons (il peut y en avoir d'autres) pourquoi ils ont été introduits:

À partir d'une API designer point de vue, j'aurais aimé être capable d'utiliser d'autres modificateurs sur les méthodes d'interface, par exemple final. Cela peut être utile lors de l'ajout de méthodes pratiques, la prévention "accidentelle" remplace dans la mise en œuvre des classes:

interface Sender {

    //Convenience method to send an empty message
    default final void send() {
        send(null);
    }

    //Implementations should only implement this method
    void send(String message);
}

Ci-dessus est déjà pratique courante si Sender étaient une classe:

abstract class Sender {

    //Convenience method to send an empty message
    final void send() {
        send(null);
    }

    //Implementations should only implement this method
    abstract void send(String message);
}

Maintenant, default et final sont évidemment contradictoires mots-clés, mais le mot clé default lui-même n'aurait pas été strictement nécessaire, donc je suis en supposant que cette contradiction est délibérée, afin de refléter les différences subtiles entre "les méthodes de la classe avec le corps" (juste des méthodes) et "méthodes d'interface avec le corps" (méthodes par défaut), c'est à dire les différences qui je n'ai pas encore compris.

À un certain point, de temps, de soutien pour les modificateurs comme static et final sur les méthodes d'interface n'est pas encore totalement exploré, citant Brian Goetz:

L'autre partie est de savoir jusqu'où nous allons aller à la classe de soutien-bâtiment
outils d'interfaces, telles que la finale de méthodes, les méthodes privées, protégées
des méthodes, des méthodes statiques, etc. La réponse est: nous ne savons pas encore

Depuis ce temps, à la fin de 2011, à l'évidence, le soutien pour static méthodes des interfaces a été ajouté. Clairement, cela ajoute beaucoup de valeur à la JDK les bibliothèques elles-mêmes, comme avec Comparateur.comparer().

Question:

Quelle est la raison final (et aussi static final) n'a jamais fait de Java 8 interfaces?

  • Hmmm... vous (ou quelqu'un avec le même nom que vous) semblent donner au moins une raison possible dans le lien citant Brian Goetz. Serait-il? Mais au-delà, je n'ai aucune idée. Je ne suis pas près de suffisamment d'expérience pour être poster dans le développement java listes de diffusion.
  • C'était moi. Mais je n'ai pas donné la réponse, j'ai seulement posé la question il y a déjà longtemps 🙂 Mais j'ai promis de Brian Goetz de ne pas déranger le lambda-dev liste de diffusion de plus avec cette demande, et puis j'ai perdu la trace de cette discussion particulière.
  • Je vois... +1 pour la question intéressante. Ce serait bien si l'un de ces designers, ont montré jusqu'à répondre à cette question. Je suppose que l'affichage de la liste de diffusion à propos de ce n'est pas exactement encouragé...
  • Merci pour le soutien. En fait, j'ai déjà discuté de cette question en particulier (et celui-ci) avec Brian Goetz dans un Courriel privé conversation. Il m'a demandé de soulever la question publiquement, pour la communauté de profiter de ces choses. Les Chances sont, il va donner une réponse faisant autorité de lui-même.
  • Oh c'est intéressant! Ne peut pas attendre pour obtenir une réponse.
  • Je suis désolé de jouer les trouble-fête, mais la seule façon de la question exprimée dans le titre va obtenir une réponse dans les termes de l'est DONC par une citation de Brian Goetz ou la JSR groupe d'Experts. Je comprends que BG a demandé un débat public, mais c'est exactement ce qui enfreint les conditions de la SORTE, comme il l'est principalement par opinion'. Il me semble que les responsabilités sont en train de disparaître ici. C'est l'Expert du Groupe de travail, et l'ensemble de la Communauté Java du Processus, afin de stimuler la discussion et de trouver des justifications. Pas SI de la. Donc je vote pour fermer comme "principalement par opinion'.
  • Comme nous le savons tous, final empêche une méthode d'être remplacé, et de voir comment vous DEVEZ remplacer les méthodes héritées d'interfaces, je ne vois pas pourquoi il serait logique de le rendre définitif. Sauf si c'était pour signifier que la méthode est définitive qu'APRÈS l'impérieuse d'une fois.. Dans ce cas, peut-être qu'il qas difficultés? Si je ne suis pas la compréhension de ce droit, s'il vous plaît laissez-moi kmow. Semble intéressant
  • Comme un membre important de la communauté, vous pouvez creuser des lambda-dev mails pour donner également une réponse faisant autorité. Ce qui s'est passé sur l'avant. Notez que Brian Goetz n'a pas demande un débat public. Il a demandé à un public Q&A. de La discussion et de la justification a longtemps été donné, mais il est caché dans les listes de diffusion qui ne sont pas bien référencé dans les recherches Google. Avoir une réponse faisant autorité ici serait en fait plus d'augmenter la qualité d'une plate-forme très utile.
  • Si je peux le faire, si vous le pouvez, et de répondre à votre propre question, qui n'a pas eu besoin de demander. Vous semblez d'accord avec moi que toute "réponse faisant autorité" doit venir de la par exemple, dans le cas le 'public Q&A' une partie de ce perd toute pertinence.
  • "Si je peux le faire, si vous le pouvez, et de répondre à votre propre question, qui n'a pas eu besoin de demander." Qui s'appliquerait assez bien à toutes les questions sur ce forum, non? Je pourrais toujours Google un certain sujet pour 5 heures de moi-même et d'apprendre quelque chose que tout le monde a à apprendre le tout aussi dure. Ou nous attendre pour un autre couple de minutes pour quelqu'un de donner une meilleure réponse que tout le monde dans l'avenir (y compris les 12 upvotes et 8 étoiles jusqu'à présent) peut en profiter, parce que tant est si bien référencé sur Google. Donc, oui. Cette question peut parfaitement s'insérer dans de SORTE Q&Un formulaire.
  • Faire de votre esprit. L'éther, vous vous demandez SI les membres de chalutage par le biais de la liste de diffusion pour vous, ce qui est un hors-sujet demande pour un hors-site de ressources ou de demander un 'public Q&A', auquel cas il est principalement opinion'. Dans les deux cas, il est hors-sujet, mais intéressant.
  • comment vous DEVEZ remplacer les méthodes héritées d'interfaces..." ce n'est pas vrai dans Java 8. Java 8 permet de mettre en œuvre des méthodes dans les interfaces, ce qui signifie que vous n'avez pas à les mettre en œuvre dans la mise en œuvre des classes. Ici, final aurait une utilisation dans la prévention de la mise en œuvre de classes de remplacer la valeur par défaut de la mise en œuvre d'une méthode d'interface.
  • Vous et moi avons été sur cette plate-forme depuis assez longtemps pour savoir que parfois, il était intéressant, et sur-rubrique questions que la personne qui pose la question pourrait ont répondu eux-mêmes. En fait, encore une fois, cela est vrai pour à peu près chaque question. Exemple: "Comment voulez-vous faire ceci et cela avec XSLT?" - "Oh, après 10h de l'expérimentation (par exemple Google), j'ai tout compris moi-même." 🙂 Je suis heureux de continuer à en discuter sur meta...
  • eh bien tout simplement il y a quelques jours, j'ai besoin de quelques default final méthodes, et a constaté qu'ils ne sont pas autorisés:( je ne vois pas de solides arguments à l'encontre de la combinaison.
  • La déclaration d'une default méthode final impliquerait que les classes de mise en œuvre de deux interfaces avec la même méthode, n'ont aucune chance de lever l'ambiguïté... d'autre part je ne vois aucune raison pratique pour interdire remplacement d'une méthode de convenance comme dans l'exemple. Il pourrait ne pas être destiné à être remplacé, mais le remplacement ne fait pas de mal. Hey, je suis en attente pour le côté “je veux traiter les interfaces des classes comme” discussion: “qu'en est-il de la visibilité que public pour interface méthodes?”.
  • Comme on peut le voir dans la cité de discussion, la visibilité de discussion est étroitement liée à la discussion sur les autres outils de construction, comme final. Malheureusement, ma référence n'est pas très à jour. Il doit y ai été plus récentes discussions concernant final. Aussi loin que le multi-héritage des conflits sont concernés, nous avons déjà ces. Considérer: interface A1 { void x(); } et interface A2 { int x(); }. Ou interface B1 extends List<Object> {} et interface B2 extends List<String> {}
  • ... de toute façon, je ne cherche pas un autre argument sur ce que devrait ou pourrait l'ai fait, je suis simplement curieux de savoir exactement pourquoi il a été décidé de la façon dont il est.
  • vous ne savez jamais: Brian Goetz peut répondre!
  • Et en effet il l'a fait, et qui peut avoir été l'intention d'origine, auquel cas mes commentaires ne s'appliquent pas. Mais si elle a l'intention d'origine, il doit avoir été clairement dit. Sinon, la question semble juste comme une opinion-collector.
  • final est un poison. Si vous essayez de plier quelqu'un d'autre bibliothèque, il est dans la manière.
  • Pour faire un cas où la finale est bénéfique dans l'interface par défaut des méthodes est l'utilisation de variadic listes d'arguments. Pour le moment, il n'est pas possible d'avoir un variadic liste d'arguments dans une méthode de l'interface sans avertissement. Une dernière méthode par défaut serait de faire de telles interfaces beaucoup plus pratique: public interface A<T> { void add(T e); @safeVarArgs default final void addAll(T... elems) { for (T e : elems) add(e); }} à Cause finale et, par conséquent, @safeVarArgs n'est pas autorisé ici, on a: "Type de sécurité: Potentiel tas de pollution par varargs paramètre elems"

InformationsquelleAutor Lukas Eder | 2014-05-04