Interface avec les méthodes par défaut vs classe Abstraite Java 8
Que Java 8 permet par défaut de mise en œuvre de méthodes dans l'interface appelée Méthodes Par Défaut, il semble y avoir une confusion entre quand dois-je utiliser un abstract class
.
Donc quand dois-interface avec les méthodes par défaut et quand doit une classe abstraite être utilisé? Sont les classes abstraites toujours utile dans ce scénario?
- Peut-être que vous ne pouvez pas toujours avoir les champs, les méthodes privées, etc. dans les interfaces, tandis que vous pouvez dans la classe abstraite?
- Je me demandais à propos de ce sujet avant, maintenant je suis clair.Grâce à @Narendra Pathai . Je voudrais ajouter un lien d'un autre thread posées par vous concernant le même sujet, que ces deux ont été mes doutes. stackoverflow.com/questions/19998309/...
- Vous pouvez trouver un joli post sur celui-ci: blog.codefx.org/java/everything-about-default-methods
- Vous pouvez encore parfois, le code d'une classe de base comme une interface, même si la classe de base a l'état. C'est juste que l'interface doit définir les setters et getters pour l'état et les classes concrètes ont à mettre en œuvre et de définir le champ. Une restriction sur ce est que dans une classe abstraite, le haricot de propriété ne peut être privé ou protégé. Dans les interfaces seulement les méthodes publiques. Une raison pour vous d'utiliser une classe de base abstraite est si vos classes ont une propriété qui doit être privés ou protégés.
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup plus de classes abstraites que par défaut les implémentations de méthode (comme privé de l'état), mais aussi de Java 8, chaque fois que vous avez le choix de soit, vous devriez aller avec le défenseur (aka.
default
) méthode dans l'interface.De la contrainte sur la valeur par défaut de la méthode est qu'elle peut être mise en œuvre que dans les termes de l'appel à d'autres méthodes d'interface, sans référence à une mise en oeuvre particulière de l'état. Ainsi, les principaux cas d'utilisation est de niveau supérieur et des méthodes pratiques.
La bonne chose à propos de cette nouvelle fonctionnalité, c'est que, là où avant vous ont été forcés à utiliser une classe abstraite pour la commodité des méthodes, limitant ainsi le réalisateur de l'héritage simple, vous pouvez maintenant avoir une vraiment propre au design de l'interface et un minimum d'effort de mise en œuvre forcé sur le programmeur.
La motivation initiale d'introduire
default
méthodes de Java 8 est le désir d'étendre les Collections Cadre des interfaces avec les lambda-méthodes orientées sans casser les implémentations existantes. Même si cela est encore plus pertinent pour les auteurs de bibliothèques publiques, vous pouvez trouver la même fonction utile dans votre projet. Vous avez un endroit centralisé où pour ajouter de nouveaux commodité et vous n'avez pas à compter sur la façon dont le reste de la hiérarchie des types de regards.public static final
et c'est ce que je veux dire par mon commentaire précédent.Collection
. Je peux ajouter une phrase à ce sujet.Il y a quelques différences techniques. Les classes abstraites peuvent en faire encore plus par rapport à Java 8 interfaces:
Sur le plan conceptuel, le but principal du défenseur des méthodes est une compatibilité descendante après l'introduction de nouvelles fonctionnalités (comme les lambda fonctions) dans Java 8.
public static final
champs d'une interface comme "l'état". Lestatic
partie signifie que le ne sont pas liés à une instance particulière à tous. Ils sont affectés sur l'instanciation de classe, qui n'est pas le même que après la création de l'instance.Ce qui est décrit dans ce l'article. Pensez à
forEach
de Collections.AbstractList::forEach
jeter unUnsupportedOperationException
.Comme décrit dans cette article,
Les classes abstraites rapport à des interfaces en Java 8
Ces deux sont très différents:
Méthodes par défaut sont à ajouter des fonctionnalités de classes existantes, sans modification de leur état.
Et les classes abstraites sont un type normal de l'héritage, ils sont classes normales qui sont destinés à être étendus.
Chaque fois que nous avons le choix entre la classe abstraite et de l'interface, nous devrions toujours (presque) préfèrent par défaut (également connu en tant que défenseur ou des extensions virtuelles) des méthodes.
Collection and AbstractCollection
. Maintenant, nous devons mettre en œuvre les méthodes de l'interface elle-même pour fournir des fonctionnalités par défaut. Les classes qui implémentent l'interface a du choix pour remplacer les méthodes ou d'hériter de l'implémentation par défaut.Une autre utilisation importante de méthodes par défaut est
interface evolution
. Supposons que j'ai eu une classe de Balle comme:public class Ball implements Collection { ... }
Maintenant dans Java 8 une nouvelle fonctionnalité de flux introduite. Nous pouvons obtenir un flux de données en utilisant
stream
méthode a été ajoutée à l'interface. Sistream
n'étaient pas une méthode par défaut toutes les implémentations deCollection
interface auraient rompu car ils ne seraient pas la mise en œuvre de cette nouvelle méthode. L'ajout d'une non-méthode par défaut d'une interface n'est passource-compatible
.Mais supposons que nous n'avons pas recompiler la classe et utiliser un vieux fichier jar qui contient cette classe
Ball
. La classe se charge très bien sans cette méthode manquante, les instances peuvent être créés et il semble que tout fonctionne bien. MAIS si le programme appellestream
méthode sur l'exemple deBall
nous auronsAbstractMethodError
. Afin de faire la méthode par défaut de résoudre les deux problèmes.Au sujet de votre requête de
java la documentation fournit la réponse parfaite.
Les Classes abstraites par Rapport aux Interfaces:
Cas d'utilisation pour chacun d'entre eux ont été expliqué ci-dessous SE post:
Quelle est la différence entre une interface et une classe abstraite?
Oui. Ils sont encore utiles. Ils peut contenir des non-statique, non-méthode final et les attributs (protégé, privé en plus de public), ce qui n'est pas possible, même avec Java 8 interfaces.
Méthodes par défaut dans l'interface Java permet évolution de l'interface.
Donné une interface existante, si vous souhaitez ajouter une méthode sans casser la compatibilité binaire avec les anciennes versions de l'interface, vous avez deux options à mains: ajouter une valeur par défaut ou d'une méthode statique. En effet, toute méthode abstraite ajoutés à l'interface devrait être impleted par les interfaces ou des classes implémentant cette interface.
Une méthode statique est unique à une classe. Une méthode par défaut est unique à une instance de la classe.
Si vous ajoutez une méthode par défaut d'une interface existante, les classes et les interfaces qui implémentent cette interface n'avez pas besoin de la mettre en œuvre. Ils peuvent
Plus sur le sujet ici.
Remi Forax règle est Vous n'avez pas de conception avec les classes Abstraites. La conception de votre application avec les interfaces. Watever est la version de Java, quelle que soit la langue. Il est soutenu par la jenterface ségrégation principe dans SOLID principes.
Vous pouvez par la suite utiliser les classes Abstraites pour factoriser du code. Maintenant avec Java 8, vous pouvez le faire directement dans l'interface. C'est une facilité, pas plus.
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 elle pourrait ne pas être essentiel pour de nombreux autres classes qui l'implémente l'interface, en Plus de permettre à votre interface pour être un interface fonctionnelle
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 abstrait d'autres méthodes utilisées dans une interface.
Dans Java 8, une interface ressemble à celle d'une classe abstraite, bien qu'il pourrait y avoir quelques différences, telles que :
1) les classes Abstraites sont des classes, de sorte qu'ils ne sont pas limités à d'autres restrictions de l'interface en Java par exemple, la classe abstraite peut avoir l'état, mais vous ne pouvez pas avoir l'état sur l'interface en Java.
2) une Autre différence sémantique entre l'interface avec les méthodes par défaut et classe abstraite est que vous pouvez définir des constructeurs à l'intérieur d'une classe abstraite, mais vous ne pouvez pas définir constructeur à l'intérieur de l'interface en Java
Méthodes par défaut dans l'Interface Java sont plus utilisées pour fournir factice de la mise en œuvre d'une fonction ainsi l'économie de toute la mise en œuvre de la classe de l'interface de la douleur et de déclarer toutes les méthodes abstraites, même si ils veulent traiter avec une seule.
Méthodes par défaut dans l'interface sont donc un moyen de plus pour le remplacement du concept de l'adaptateur de classes.
Les méthodes dans la classe abstraite sont pourtant censés donner un sens de la mise en œuvre des enfants de la classe doit remplacer si nécessaire remplacer une fonctionnalité commune.
Merci de penser d'abord ouvert/fermé principe. Les méthodes par défaut dans les interfaces de FAIRE de la VIOLER. C'est une mauvaise fonction en Java. Il encourage les mauvais design, mauvais de l'architecture, de la faible qualité des logiciels. Je suggère d'éviter d'utiliser des méthodes par défaut complètement.
Posez-vous quelques questions:
Pourquoi ne pouvez-vous pas mettre vos méthodes de la classe abstraite? Auriez-vous besoin de plus d'une classe abstraite? Alors pensez à ce que votre classe est responsable. Êtes-vous sûr que toutes les méthodes que vous allez mettre à la seule classe vraiment atteindre le même but? Peut-être vous permettra de distinguer plusieurs fins, et ensuite diviser votre classe en plusieurs classes, pour chaque objet sa propre classe.