2012-04-25 5 views
0

J'ai refactorisé ma méthode en utilisant "Introduire un paramètre" car il acceptait beaucoup de variables. mais maintenant tous les appelants ont cosntructor en ligne commeconstructeurs de refactor dans setters dans java

this.somemethod(new MyParam("a", "b","c","d"); 

je voudrais factoriser en remplaçant constructeur avec setters comme

MyParam myParam= new MyParam(); 
myParam.setA("a");........ 
. 
. 
this.somemethod(myParam); 

Est-il someway pour ce faire ??

il y avait un bug similaire rapporté sur Eclipse https://bugs.eclipse.org/bugs/show_bug.cgi?id=105324

+1

Etes-vous vraiment sûr de vouloir faire cela? Peut-être que vous voulez diviser MyParam en plusieurs classes à la place ... – claesv

+1

fondamentalement je n'aime pas la longue ligne de code car il devient vraiment difficile à lire et très difficile à comprendre quels paramètres sont passés – Edge

Répondre

0

Si je vous comprends bien, vous voulez que votre constructeur actuel passe automatiquement à un constructeur sans paramètre avec des appels ultérieurs aux setters. Je le ferais en plaçant les appels setter dans le constructeur en cours, en vérifiant qu'ils sont tous public, puis en exécutant la refonte de la méthode Inline sur le constructeur. Ah, mais Eclipse ne vous laissera pas faire ça.Vous pouvez donc écrire:

public static A newA(int a, int b) { 
    A aa = new A(); 
    aa.setA(a); 
    aa.setB(b); 
    return aa; 
} 

(Bien sûr, vous devez écrire le constructeur vide, aussi), puis remplacer manuellement tous

a = new A(3,2); 

avec

a = A.newA(3,2); 

et puis vous pouvez intégrer la méthode newA(). Ça ne vaut vraiment pas la peine, je pense. Mais je ne connais pas de manière plus automatisée.

+0

Je pense que j'ai vraiment besoin de le faire mais merci quand même – Edge

0

pourquoi tu fais cette chose laide?

Pourquoi ne pas faire quelque chose comme

public void sometMethod(Object.. parameters) 

Et vous pouvez y accéder comme

this.someMethod("a", "b", "c", "d", "e", "f"); //:) 
//or 
this.someMethod("a"); 

Et pour répondre à votre solution ... vous pouvez .. utilisant la réflexion ...

Vous pouvez accéder à votre méthode dynamique utilisant la réflexion ... link here

2

Y a-t-il un moyen de le faire?

Oui, ont des fonctions setter comme ce retour this afin que vous puissiez les enchaîner:

public class MyParam { 
    private String foo; 
    private int bar; 
    // ...and so on... 

    public MyParam() { 
     // Set reasonable defaults here 
    } 

    public MyParam letFoo(String foo) { 
     this.foo = foo; 
     return this; 
    } 

    public MyParam letBar(int bar) { 
     this.bar = bar; 
     return this; 
    } 

    // ...and so on... 
} 

Utilisation:

someFunction(new MyParam() 
      .letFoo("foo") 
      .letBar(42) 
      .letXyz(...) 
      // ...and so on... 
); 

Ceci est particulièrement utile lorsque A) Il y a par défaut raisonnables pour plusieurs des "paramètres" et donc les appelants ne devront pas nécessairement utiliser tous les setters, et B) Il y a beaucoup de paramètres donc il est facile de se perdre dans l'ordre des choses.

Je l'ai utilisé letXyz plutôt que setXyz parce que Sean fait remarquer dans les commentaires, setXyz utilise la convention de nommage JavaBean, mais setters JavaBeans ne devrait pas avoir une valeur de retour. (Pour plus d'informations, voir this other question here on SO et ses réponses.)

+0

+1 mais je ne suis pas d'accord sur le nom. setXyz suggère des méthodes Java bean, ce qu'elles ne sont pas (les setters Java Beans peuvent ne pas avoir de valeur de retour). J'appellerais les méthodes "withXyz" ou quelque chose comme ça, après tout, vous construisez quelque chose. –

+0

@SeanPatrickFloyd: Bon point. Je n'aime pas 'setFoo' ou' withFoo', mais le nom est moins important que le concept. –

+0

Je l'ai voulu avec refactoring car je vais finir par changer beaucoup de fichiers sinon. – Edge