2009-09-02 4 views
8

Beim Refactoring von Methoden ist es einfach, binäre Inkompatibilitäten (mit früheren Versionen des Codes) in Java einzuführen.Refactored-Methoden und Binärkompatibilität in Java

Betrachten wir ein Verfahren Ändern der Art seiner Parameter an eine übergeordnete Schnittstelle zu erweitern:

void doSomething(String x); 

// change it to 

void doSomething(CharSequence c); 

der gesamte Code, der diese Methode verwendet wird weiterhin ohne Änderungen kompilieren, aber es erfordert eine erneute Kompilierung (weil die alten Binärdateien mit einem MethodNotFoundError fehlschlagen).

Wie wäre es, eine Methode in eine Elternklasse zu ziehen? Wird dies eine Neukompilierung erfordern?

// before 
public class B extends A{ 
    protected void x(){}; 
} 

// after 
public class A { 
    public void x(){}; 
} 
public class B extends A{} 

Die Methode wurde von B nach dem übergeordneten A bewegt auch die Sichtbarkeit zu öffentlichen geschützt geändert Es wurde aus (aber das ist kein Problem).

Muss ich in B einen "binären Kompatibilitäts-Wrapper" verwalten, oder funktioniert er (wird automatisch an die übergeordnete Klasse gesendet)?

// do I need this ? 
public class B extends A{ 
    // binary compatibility wrapper 
    public void x(){ super.x(); } 
} 

Antwort

12

„Widening“ wirkt sich auf die Unterschrift des Verfahrens, so dass nicht binär kompatibel ist. Das Verschieben einer Methode in eine Superklasse wirkt sich nicht auf die Methodensignatur aus, daher wird es funktionieren. Eclipse hat ein großes Dokument, das API und ABI-Kompatibilität beschreibt:

http://wiki.eclipse.org/Evolving_Java-based_APIs

Mehr expliziten Regeln sind in Teil 2:

http://wiki.eclipse.org/Evolving_Java-based_APIs_2

Ich glaube, Sie haben Interesse an „Change Typ eines formaler Parameter "(dh, was Sie als Erweiterung bezeichnen) oder" API-Methode herauf Typhierarchie verschieben "(dh was Sie als Pull in eine Elternklasse bezeichnen).

-1

Es sollte weiterhin automatisch arbeiten, wie Java dynamisch hat Verknüpfung

+0

Ich dachte dasselbe über die erweiterten Methoden ... Das funktioniert nicht, weil die Klassennamen der Argumente Teil des internen Methodennamens werden. Ich frage mich, ob das gleiche für den Namen der Klasse gilt, den der Compiler für die Methode hält. – Thilo

+1

"Erweiterung" wirkt sich auf die Signatur der Methode aus, aber das Verschieben der Methode in eine Superklasse funktioniert nicht. Probieren Sie es auf der Kommandozeile aus. –

+0

@bkail: mach das eine Antwort, damit ich es abstimmen kann. – Thilo