2013-04-29 6 views
5

Wenn ein Entwickler eine Java-Klasse erweitert, die Teil des JDK ist, und neue Methoden hinzufügt, besteht immer das Risiko, dass eine zukünftige Version von Java Methoden mit demselben Namen/derselben Signatur einführt, was zu einem unerwünschten Verhalten des Programms führt mit diesen zukünftigen Versionen ausgeführt. Da keine Annotation "Non-Overrides" verfügbar ist (siehe http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7152222), die solche möglichen Probleme erkennt, wenn jemand den Code mit einer neueren Version des JDK kompiliert, muss der Entwickler diese Überprüfung auf andere Weise durchführen. Welchen Ansatz verwenden Sie?Welchen Ansatz können Sie in eigenen Programmen nutzen, um Updates für zukünftige Java-Versionen zu nutzen?

+0

Welche Java-Klasse möchten Sie erweitern? Vielleicht gibt es einen Ratschlag, wenn Sie den Anwendungsfall mehr angeben können. – vikingsteve

+0

Das Problem trat beim Übergang von JDK6 zu JDK7 auf, wo die Methode getType() in JDK7 eingeführt wurde. Wir hatten einige Klassen in unserem Code, die java.awt.Window erweiterten und bereits eine getType() -Methode hatten. – mschenk74

Antwort

13

Es ist ein Antipattern, um JDK-Klassen zu erweitern, mit Ausnahme derer, die speziell dafür entwickelt wurden, sie zu erweitern. Sie sollten stattdessen das Muster Decorator verwenden, um Features zu JDK-Klassen hinzuzufügen. JDK ist kein besonderer Fall, dies gilt auch für Bibliotheken von Drittanbietern.

+0

+1 - Es gibt keine zukunftssichere Möglichkeit, Klassen zu erweitern, die nicht erweitert werden sollen. Bester Ansatz? Tu es einfach nicht! –

+0

Die konkrete JDK-Klasse war java.awt.Window, die konkrete Methode war getType(). Im Allgemeinen stimme ich Ihnen zu, aber in diesem speziellen Fall war die Erweiterung der Window-Klasse die einzige Möglichkeit. – mschenk74

+0

@ mischenk74 Da 'Window' die Basis der kompletten GUI-Container-Klassenhierarchie ist, sehe ich nicht, wie du etwas erreichen würdest, selbst wenn du es unterklassierst: der ganze Rest des JDK würde sich immer noch von' Window erstrecken 'und nicht von Ihrer benutzerdefinierten Unterklasse. –

0

Vererbung ist eine mächtige Technik, aber aufgrund des Mangels an Wissen kann es schlimmer sein. In diesem Fall müssen Sie Komposition statt Vererbung verwenden. Erstellen Sie eine Klasse, die das Objekt der beliebigen Java-Klasse enthält, die Sie erweitern möchten, und erweitern Sie dann Ihre Klasse auf diese neu erstellte Klasse anstelle der ORIGNAL-Klasse.