Java 8 default-Methoden Merkmale : sicher?
Ist es ein Sicheres Verfahren zu verwenden, Standard Methoden wie ein armer Mann-version von Merkmalen in Java 8?
Manche behaupten, er kann machen pandas traurig , wenn Sie Sie verwenden, nur um der es, weil es cool ist, aber das ist nicht meine Absicht. Es ist auch oft daran erinnert, dass Standard-Methoden wurden eingeführt, um die Unterstützung API-Entwicklung und Abwärtskompatibilität, das ist wahr, aber das macht es nicht falsch oder verdreht, um Sie als Merkmale per se.
Habe ich die folgenden praktischen Anwendungsfall in den Sinn:
public interface Loggable {
default Logger logger() {
return LoggerFactory.getLogger(this.getClass());
}
}
Oder vielleicht definieren Sie ein PeriodTrait
:
public interface PeriodeTrait {
Date getStartDate();
Date getEndDate();
default isValid(Date atDate) {
...
}
}
Admitedly, Zusammensetzung verwendet werden könnten (oder auch Helfer-Klassen), aber es scheint, Ausführlicher und unübersichtlich und nicht zulassen, profitieren von Polymorphismus.
So, ist es ok/safe Standard-Methoden als grundlegende Merkmale, oder sollte ich mir sorgen über unvorhergesehene Nebenwirkungen?
Mehrere Fragen auf, SO sind im Zusammenhang mit Java vs. Scala Züge; das ist nicht der Punkt hier. Ich verlange nicht bloß für Stellungnahmen. Stattdessen, ich bin auf der Suche nach einer autorisierenden Antwort oder zumindest das Feld Einsicht: wenn du bereits mit Standard-Methoden als Merkmale auf Ihre corporate Projekt, hat es sich als eine timebomb?
- Es scheint mir, als könnten Sie die gleichen Vorteile von Vererbung einer abstrakten Klasse, und Sie müssen nicht sorgen zu machen pandas Weinen... Der einzige Grund, ich kann sehen, zu verwenden eine Standard-Methode in einer Schnittstelle ist, dass Sie die Funktionalität und nicht ändern können eine Reihe von legacy-code, der basierend auf der Schnittstelle.
- Ich Stimme mit @infosec812 über die Erweiterung einer abstrakten Klasse definiert seine eigenen statischen logger-Feld. Wäre es nicht Ihre logger () - Methode instanziiert ein neues logger-Instanz jeder Zeit die genannte?
- Für die Anmeldung, möchten Sie vielleicht zu schauen Projectlombok.org und der @Slf4j-annotation.
- Verwandte Frage: Warum ist das "Finale" nicht erlaubt in Java 8 interface-Methoden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort ist: es ist sicher, wenn Sie Sie sicher benutzen 🙂
Den snarky Antwort: sagen Sie mir, was Sie damit meine Züge, und vielleicht gebe ich dir eine bessere Antwort 🙂
Allen ernstes, den Begriff "Merkmal" ist nicht klar definiert. Viele Java-Entwickler sind die meisten vertraut mit Eigenschaften, wie Sie ausgedrückt sind in Scala, aber Scala ist weit von der ersten Sprache haben Eigenschaften, die entweder im Namen oder in der Wirkung.
Beispielsweise in Scala die traits sind zustandsbehaftet (kann
var
Variablen); in der Festung sind Sie Reine Verhalten. Java-interfaces mit default-Methoden sind statusfrei, bedeutet dies, dass Sie sind nicht Eigenschaften? (Hinweis: das war eine Fangfrage.)Wieder, in der Scala, die Züge werden zusammengesetzt durch Linearisierung; wenn die Klasse
A
erstreckt ZügeX
undY
, dann die Reihenfolge, in der dieX
undY
vermischt werden bestimmt, wie Konflikte zwischenX
undY
aufgelöst werden. In Java, diese Linearisierung Mechanismus ist nicht vorhanden (es wurde abgelehnt, zum Teil, weil es zu "un-Java-like".)Der unmittelbare Grund für das hinzufügen von default-Methoden in Schnittstellen zur Unterstützung interface evolution, aber wir waren uns sehr wohl bewusst, dass wir gingen hinaus. Ob Sie der Auffassung sind, dass "interface evolution" ++" oder "traits" --" ist eine Frage der persönlichen interpretation. Also, um deine Frage zu beantworten über die Sicherheit ... so lange Sie das halten, was der Mechanismus tatsächlich unterstützt, anstatt zu versuchen, wishfully Strecken, um etwas, das es nicht unterstützt, Sie sollten in Ordnung sein.
Einer wichtigsten design-Ziel war, dass, aus der Perspektive der client einer Schnittstelle, Standard-Methoden sollten nicht von "normalen" interface-Methoden. Die Standard-ness einer Methode, daher nur interessant für die designer und Implementierung der Schnittstelle.
Hier sind einige Anwendungsfälle, die auch innerhalb der design-Ziele:
Interface evolution. Hier fügen wir eine neue Methode, um eine vorhandene Schnittstelle, die eine sinnvolle default-Implementierung in Bezug auf vorhandene Methoden auf die Schnittstelle. Ein Beispiel wäre das hinzufügen der
forEach
MethodeCollection
, wo die default-Implementierung geschrieben, die in Bezug auf dieiterator()
Methode."Optional" - Methoden. Hier haben die designer ein interface, sagt: "Implementors müssen nicht implementieren Sie diese Methode, wenn Sie bereit sind, zu Leben, mit den Einschränkungen in der Funktionalität, was dazugehört". Zum Beispiel
Iterator.remove
gegeben wurde, eine Vorgabe die wirftUnsupportedOperationException
; da die überwiegende Mehrzahl der Implementierungen vonIterator
haben dieses Verhalten sowieso, der Standard macht diese Methode im wesentlichen optional. (Wenn das Verhalten vonAbstractCollection
wurden ausgedrückt als Standardwerte aufCollection
, wir könnten das gleiche tun für die Heilpädagogische Methoden.)Convenience-Methoden. Diese sind Methoden, die sind ausschließlich für die Bequemlichkeit, erneut in der Regel umgesetzt in Form von nicht-Standard-Methoden der Klasse. Die
logger()
- Methode im ersten Beispiel wird eine angemessene illustration.Combinators. Dies sind die kompositorischen Methoden, instanziieren Sie neue Instanzen der Schnittstelle, basierend auf der aktuellen Instanz. Zum Beispiel, die Methoden
Predicate.and()
oderComparator.thenComparing()
sind Beispiele des combinators.Wenn Sie eine Standardimplementierung bereitstellen, sollten Sie auch einige Spezifikation für den Standard - (im JDK verwenden wir die
@implSpec
javadoc-tag für diese) zu Hilfe implementors verstehen, ob Sie diese Methode überschreiben oder nicht. Einige Standardeinstellungen, wie convenience-Methoden und combinators, sind fast nie außer Kraft gesetzt; andere, wie optionale Methoden, werden oft außer Kraft gesetzt. Sie müssen genügend Spezifikation (nicht nur Dokumentation) über das, was der Standard verspricht, zu tun, so dass die Implementierung kann eine sinnvolle Entscheidung darüber, ob Sie brauchen, um es zu überschreiben.MouseListener
? In dem Umfang, dass diese API-Stil macht Sinn, das passt in die "optionale Methoden" Eimer. Stellen Sie sicher, dass dokumentieren die optional-ness deutlich!MouseListener
. Danke für die Antwort.