Java 8: extension virtuelle des méthodes vs classe abstraite
Je suis à la recherche de la nouvelle extension virtuelle des méthodes en Java 8 interfaces:
public interface MyInterface {
default String myMethod() {
return "myImplementation";
}
}
- Je obtenir leur but en permettant une interface d'évoluer au fil du temps, et de l'héritage multiple bits, mais ils ont l'air terriblement comme une classe abstraite pour moi.
Si vous êtes en train de faire de nouveaux travaux sont des classes abstraites préféré sur les méthodes d'extension pour fournir de la mise en œuvre d'une "interface" ou sont ces deux approches conceptuellement équivalents?
- lambdafaq.org/... - la distinction entre l'héritage de comportement contre l'héritage de l'état est crucial.
- Et Quels sont
default
méthodes? qui assez bien énonce exactement leur but. Leur but principal est de permettre la compatibilité avec le code qui compile contre Java 7 et de ne pas mettre en œuvre de la "fonctionnelle" méthodes ajoutée à Java 8.
Vous devez vous connecter pour publier un commentaire.
Un but principal de ces constructions est de préserver la compatibilité ascendante. L'ajout de fermetures pour le langage Java est tout à fait une modification majeure, et les choses doivent être mis à jour afin de profiter pleinement de cette. Par exemple,
Collection
dans Java 8 aura des méthodes telles queforEach()
qui fonctionnent en conjonction avec les lambdas. Tout simplement l'ajout de telles méthodes pour la pré-existantCollection
interface ne serait pas possible, puisque cela permettrait de casser la compatibilité ascendante. Une classe que j'ai écrit en Java 7 mise en place deCollection
n'auraient plus à compiler depuis qu'elle manquerait de ces méthodes. Par conséquent, ces méthodes sont introduites avec un "défaut" de la mise en œuvre. Si vous connaissez Scala, vous pouvez voir que Javainterface
s sont de plus en plus comme Scalatrait
s.Comme pour les interfaces vs les classes abstraites, les deux sont toujours différents dans Java 8; vous ne pouvez avoir un constructeur dans une interface, par exemple. Par conséquent, les deux approches ne sont pas "conceptuellement équivalents" en soi. Les classes abstraites sont plus structurés et peuvent avoir un état associé avec eux, alors que les interfaces ne peuvent pas. Vous devez utiliser n'importe quel fait plus de sens dans le cadre de votre programme, tout comme vous le feriez dans Java 7 et ci-dessous.
Les classes abstraites attente (champs d'instance), dans le but de fournir certaines communes comportement (méthodes).
Vous n'avez pas souvent (jamais?) voir une classe abstraite sans état.
Interfaces spécifier les fonctionnalités. Ils sont destinés à déclarer comportement comme un contrat, de ne pas la mettre en œuvre.
Ainsi, toutes les méthodes qui sont spécifiés dans le cadre d'une interface sont "helper" méthodes -- ils n'affectent pas la mise en œuvre.
java.util.AbstractCollection
? Il est normal que les classes abstraites ne pas avoir l'état. À partir de Java SE 8, le fait que les classes abstraites peuvent avoir l'état de l'instance et les interfaces avec des implémentations ne peut pas est juste une bizarrerie de la langue.AbstractCollection
, dit-il, ", Cette classe fournit un squelette de mise en œuvre de laCollection
interface, afin de réduire l'effort nécessaire pour implémenter cette interface." En d'autres mots, c'est juste une commodité, mais il n'a pas besoin d'être là pour une conception particulière raisons. En revanche,Collection
est nécessaire pour l'écriture de code générique qui fonctionne pour toutes les collections.Collection
contiennent des "squelette de mise en œuvre de laCollection
interface"Si vous voulez écrire une API qui permet à l'utilisateur d'utiliser des expressions lambda, vous devez utiliser les interfaces de la place.
Les classes abstraites au cours des scores
java-8
interfaces dans les secteurs ci-dessous.Avec les classes abstraites, vous pouvez déclarer des champs qui sont pas statique et définitive, et de définir le public, protected et private méthodes concrètes. Avec les interfaces, tous les champs sont automatiquement public, static et final, et toutes les méthodes qui vous déclarer ou de définir (en tant que par défaut les méthodes sont publiques
Mutable état peut être partagée/modifié avec enfant des classes à la différence de l'interface qui ont uniquement des constantes
Différence entre une classe Abstraite & interface fonctionnelle sont nombreux comme la différence entre une interface normale et classe abstraite mais de mesurer la différence est
nous pouvons avoir des méthodes par défaut dans l'interface fonctionnelle, mais pas dans la classe abstraite, ce qui change et a permis à tous de la collection de la mise en œuvre en java 8 foreach() et d'autres performances de la méthode avec l'utilisation de lambda