Quel est le but de mots clés par défaut en Java?
Une interface en Java est similaire à une classe, mais le corps d'un
l'interface peut inclure seulement des méthodes abstraites etfinal
champs
(les constantes).
Récemment, j'ai vu une question, qui ressemble à ceci
interface AnInterface {
public default void myMethod() {
System.out.println("D");
}
}
Selon la définition de l'interface, seulement des méthodes abstraites sont autorisés. Pourquoi a-t-il me permettre de compiler le code ci-dessus? Qu'est-ce que le default
mot-clé?
D'autre part, quand j'ai essayé d'écrire de code ci-dessous, puis il dit modifier default not allowed here
default class MyClass{
}
au lieu de
class MyClass {
}
Quelqu'un peut me dire le but de la default
mot-clé? Est-il permis qu'à l'intérieur d'une interface? Comment est-il différent de default
(pas de modificateur d'accès)?
- méthodes par défaut dans les interfaces ont été ajoutés dans Java 8. Ce n'est pas un modificateur d'accès, c'est un défaut de mise en œuvre.
- ne pensez-vous pas, l'introduction de la méthode par défaut de violation de la définition de l'interface ? :s
- Il a changé la définition de l'interface. Cette définition est maintenant obsolète.
- Ils ont été mis en place pour appuyer les lambdas. Les détails de pourquoi ils sont nécessaires sont dans l'homme de paille proposition de Projet Lambda.
Vous devez vous connecter pour publier un commentaire.
C'est une nouvelle fonctionnalité de Java 8, qui permet à un
interface
pour fournir une implémentation. Décrit dans Java 8 JLS-13.5.6. Déclarations De Méthode D'Interface qui lit (en partie)Ce qui est Nouveau dans le JDK 8 dit (en partie)
default
méthodes est assez différent de celui du béton de méthodes dans une classe abstraite qui ne sont pas remplacés, même si je ne suis pas sûr exactement comment.private
méthodes.private
méthodes ne sont pas vraiment partie de l'interface, mais peut servir de méthodes d'aide pour ladefault
implémentations ou à l'intérieur de la constante d'initialiseurs. A noter qu'ils existent déjà dans Java 8, que, lorsque vous utilisez les expressions lambda dans les interfaces, synthétiqueprivate
méthodes sont générés. Donc Java 9 vous permet d'utiliser cette fonctionnalité pour non-synthétique, non lambda utilise aussi bien...Par défaut méthodes ont été ajoutées à Java 8 principalement pour le support des expressions lambda. Les concepteurs habilement, de mon point de vue) a décidé de faire lambdas syntaxe pour la création d'anonymes implémentations de l'interface. Mais étant donné les lambdas ne peut mettre en œuvre une méthode unique qu'ils seraient limités à des interfaces avec une méthode unique qui serait une assez sévère restriction. Au lieu de cela, par défaut méthodes ont été ajoutées pour permettre à plus d'interfaces complexes à utiliser.
Si vous avez besoin de convaincre de la demande qui
default
a été introduit en raison de lambdas, notez que le homme de paille proposition de Projet Lambda, par Mark Reinhold, en 2009, mentionne "les méthodes d'Extension" comme un élément obligatoire pour être ajoutés à l'appui des lambdas.Voici un exemple illustrant le concept:
Très artificiel, je me rends compte, mais doivent illustrer comment
default
prend en charge les lambdas. Parce queinverse
est un défaut, il peut facilement être remplacée par une mise en œuvre de classe, si nécessaire.Un nouveau concept est introduit dans Java 8 intitulée méthodes par défaut. Méthodes par défaut, les méthodes sont celles qui ont des valeurs par défaut de la mise en œuvre et aide à faire évoluer les interfaces sans casser le code existant. Regardons un exemple:
et la sortie est de:
Faire un peu de Travail mise en œuvre dans la classe
DoSomeOtherWork mise en œuvre dans l'interface
Quelque chose qui a été oublié dans les autres réponses a été son rôle dans les annotations. D'aussi loin que Java 1.5, le
default
mot-clé sont venus comme un moyen de fournir une valeur par défaut pour un champ d'annotation.Usage a été surchargé avec l'introduction de Java 8 pour permettre de définir une méthode par défaut dans les interfaces.
Quelque chose d'autre qui a été négligé: la raison pour laquelle la déclaration
default class MyClass {}
est pas valide est dû à la façon dont les classes sont déclarées à tous. Il n'y a pas de disposition dans la langue qui permet pour le mot clé d'y paraître. Il ne apparaissent pour déclarations de méthode d'interface, si.Une très bonne explication se trouve dans La Java™ Tutoriels, une partie de l'explication est la suivante:
Prenons un exemple qui implique les fabricants d'automobiles commandés par ordinateur, qui publie des standards de l'industrie des interfaces qui décrivent les méthodes peuvent être invoquées pour faire fonctionner leurs voitures. Que faire si ceux contrôlés par l'ordinateur, fabricants d'automobiles ajouter de nouvelles fonctionnalités, telles que le vol, à leurs voitures? Ces fabricants aurait besoin de définir de nouvelles méthodes pour permettre à d'autres entreprises (telles que l'électronique de l'instrument d'orientation des fabricants) à adapter leurs logiciels pour vol de voitures. Où en seraient les fabricants de voitures de déclarer ces nouvelles vol méthodes liées? Si ils ajoutent à leur origine interfaces, les programmeurs qui ont mis en oeuvre les interfaces faudrait réécrire leur mise en œuvre. Si on ajoute à eux comme à des méthodes statiques, puis les programmeurs considèrent comme les méthodes de l'utilitaire, pas que essentielles, fondamentales méthodes.
Méthodes par défaut vous permettent d'ajouter de nouvelles fonctionnalités pour les interfaces de vos bibliothèques et de s'assurer de la compatibilité binaire avec le code écrit pour les versions plus anciennes de ces interfaces.
La nouvelle Java 8 fonctionnalité (Méthodes Par Défaut) permet à une interface pour permettre une mise en œuvre lors de son étiquetés avec la
default
mot-clé.Par Exemple:
Interface de Test utilise la valeur par défaut de mot-clé qui permet à l'interface de fournir une implémentation par défaut de la méthode, sans la nécessité de la mise en œuvre de ces méthodes dans les classes qui utilise l'interface.
Compatibilité ascendante:
Imaginez que votre interface est implémentée par des centaines de classes, de modifier cette interface va forcer tous les utilisateurs à mettre en œuvre la nouvelle méthode, même si ce n'est pas essentiel pour de nombreuses autres classes qui implémente l'interface.
Faits & Restrictions:
1-ne Peuvent être déclarées dans une interface et non pas au sein d'une classe ou d'
la classe abstraite.
2-fournir un corps
3-Il n'est pas supposé être public ou abstraite d'autres méthodes utilisées dans une interface.
Méthodes par défaut vous permettent d'ajouter de nouvelles fonctionnalités à l'interface de vos applications. Il peut également être utilisé pour avoir une multi héritage.
En plus des méthodes par défaut, vous pouvez définir des méthodes statiques dans les interfaces. Cela rend plus facile pour vous d'organiser les méthodes d'aide
Méthodes par défaut dans l'interface de nous permettre d'ajouter de nouvelles fonctionnalités sans casser de l'ancien code.
Avant Java 8, si une nouvelle méthode a été ajouté à une interface, puis toutes les classes d'implémentation de cette interface ont été tenus de passer outre à cette nouvelle méthode, même si ils n'ont pas utilisé cette nouvelle fonctionnalité.
Avec Java 8, nous pouvons ajouter de la valeur par défaut de mise en œuvre de la nouvelle méthode à l'aide de la
default
mot-clé avant l'implémentation de la méthode.Même avec des anonymes, des classes ou des interfaces fonctionnelles, si nous voyons certains de code est réutilisable et nous ne voulons pas de définir la même logique partout dans le code, on peut écrire des implémentations par défaut de ceux-ci et de les réutiliser.
Exemple