Oui la grosse différence c'est qu'une classe abstraite peut avoir un état via des variables, et donc une implémentation plus concrète, là où une interface ne pourra se baser que sur de l'abstrait.
Donc malgré cela les 3 couches restent toujours utile (interfaces avec méthodes par défaut, classe abstraites avec implémentation de base, puis classe concrète avec implémentation finale).
Tu parles de classes utilitaires et cela semble bien être l'objectif premier des méthodes par défaut et des méthodes static dans les interfaces, tout en permettant de mieux les référencer (puisqu'elle sont directement visible dans l'interface en question sans avoir à chercher la classe utilitaire associé).
Par exemple l'interface Comparator s'est bien étoffé !
Jusqu'à présent si on voulait créer un Comparator selon plusieurs critères, il fallait tout coder soit-même :
1 2 3 4 5 6 7 8 9 10 11 12 13
| Comparator<User> c = new Comparator<User>() {
@Override
public int compare(User u1, User u2) {
int diff = u1.getFirstName().compareTo(u2.getFirstName());
if (diff==0) {
diff = u1.getLastName().compareTo(u2.getLastName());
if (diff==0) {
diff = Integer.compare(u1.getAge(), u2.getAge());
}
}
return diff;
}
}; |
Désormais l'interface Comparator possède des méthodes static comparing() permettant de créer des Comparators à partir d'un fonction retournant une valeur.
Par exemple pour comparer des User selon la valeur retournée par getFirstName() :
Comparator<User> c = Comparator.comparing( (User u) -> u.getFirstName() );
On peut même remplacer la lambda par une référence de méthode, ce qui rend le tout encore plus lisible :
Comparator<User> c = Comparator.comparing( User::getFirstName );
S'ajoute à cela des méthodes par défaut thenComparing() permettant d'ajouter une règle supplémentaire à un Comparator existant, selon le même principe.
On obtient alors notre Comparator selon les 3 critères assez facilement :
1 2 3
| Comparator<User> c = Comparator.comparing(User::getLastName)
.thenComparing(User::getFirstName)
.thenComparingInt(User::getAge); |
a++
Partager