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(); }
}
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
"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. –
@bkail: mach das eine Antwort, damit ich es abstimmen kann. – Thilo