Podczas refaktoryzacji metod łatwo jest wprowadzić nieporozumienia binarne (z wcześniejszymi wersjami kodu) w Javie.Refaktoryzowane metody i kompatybilność binarna w Javie
Rozważ zmianę metody do poszerzenia typu jej parametr do interfejsu nadrzędnego:
void doSomething(String x);
// change it to
void doSomething(CharSequence c);
Cały kod, który korzysta z tej metody będzie nadal skompilować bez zmian, ale wymaga ponownej kompilacji (ponieważ stare pliki binarne zawiedzie z MethodNotFoundError).
Co powiecie na przeciągnięcie metody do klasy rodzica. Czy będzie to wymagało ponownego skompilowania?
// before
public class B extends A{
protected void x(){};
}
// after
public class A {
public void x(){};
}
public class B extends A{}
Metoda została przeniesiona z B do rodzica A. Zmieniono także widoczność z chronionej na publiczną (ale to nie jest problem).
Czy muszę zachować "opakowanie binarne" w B, czy będzie ono nadal działać (automatycznie wysyłane do klasy nadrzędnej)?
// do I need this ?
public class B extends A{
// binary compatibility wrapper
public void x(){ super.x(); }
}
Myślałem to samo o rozszerzonych metodach ... To nie działa, ponieważ nazwy klas argumentów stają się częścią nazwy metody wewnętrznej. Zastanawiam się, czy to samo dotyczy nazwy klasy, którą według kompilatora deklaruje metoda. – Thilo
"Poszerzanie" wpływa na sygnaturę metody, ale przeniesienie tej metody do nadklasy nie działa. Wypróbuj go w linii poleceń. –
@bkail: utwórz tę odpowiedź, abym mógł zagłosować. – Thilo