2009-09-02 9 views
8

Lors de la refactorisation des méthodes, il est facile d'introduire des incompatibilités binaires (avec les versions précédentes du code) en Java.Méthodes refacturées et compatibilité binaire en Java

envisager de changer une méthode pour élargir le type de son paramètre à une interface parent:

void doSomething(String x); 

// change it to 

void doSomething(CharSequence c); 

Tout le code qui utilise cette méthode continuera à compiler sans modifications, mais il nécessite une nouvelle compilation (car les anciens binaires échoueront avec un MethodNotFoundError). Que diriez-vous de tirer une méthode dans une classe parente. Cela exigera-t-il une recompilation?

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

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

La méthode a été déplacé de B à A. parent Il a également changé la visibilité de la protection au public (mais ce n'est pas un problème). Dois-je maintenir un "wrapper de compatibilité binaire" dans B, ou continuera-t-il à fonctionner (envoi automatique à la classe parent)?

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

Répondre

12

« élargissement » affecte la signature de la méthode de sorte que n'est pas binaire compatible. Le déplacement d'une méthode vers une superclasse n'affecte pas la signature de la méthode, donc cela fonctionnera. Eclipse a un document qui décrit l'API et la compatibilité ABI:

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

Des règles plus explicites sont en partie 2:

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

Je crois que vous êtes intéressé par « type de changement d'un paramètre formel "(c'est-à-dire, ce que vous appelez élargissement) ou" Déplacer la méthode API vers hiérarchie de types "(c'est-à-dire, ce que vous appelez tirer dans une classe parente).

-1

Il doit continuer à travailler comme Java a automatiquement dynamique reliant

+0

Je pensais la même chose à propos des méthodes élargies ... Cela ne fonctionne pas parce que les noms de classe des arguments font partie du nom de la méthode interne. Je me demande si la même chose est vraie avec le nom de la classe que le compilateur pense avoir déclaré la méthode. – Thilo

+1

"Élargissement" affecte la signature de la méthode, mais pas la migration de la méthode vers une superclasse. Essayez-le sur la ligne de commande. –

+0

@bkail: faites-en une réponse, pour que je puisse voter. – Thilo