2012-04-25 60 views
0

我重構了使用「引入參數」的方法,因爲它接受了很多變量。但現在所有的來電都內嵌cosntructor作爲將重構構造函數轉換爲java中的setters

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

我想用setter方法代替構造像

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

重構它有什麼方法做到這一點?

有類似的bug報告日食https://bugs.eclipse.org/bugs/show_bug.cgi?id=105324

+1

你真的確定要這麼做?也許你想MyParam分成幾類,而不是... – claesv 2012-04-25 08:30:38

+1

基本上我不喜歡的代碼長行,因爲它變得很艱難的齧合閱讀和非常艱難的齧合瞭解什麼參數獲得通過 – Edge 2012-04-25 08:32:58

回答

0

如果我理解正確,您希望自動從當前的構造函數獲得一個無參數構造函數,並隨後調用這些構造函數。我會通過將setter調用放入當前構造函數中,確保它們全部爲public,然後在構造函數上運行Inline Method重構。啊,但Eclipse不會讓你這樣做。所以,你可以寫:

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

(當然,你得寫空構造,太),然後所有

a = new A(3,2); 

a = A.newA(3,2); 

手動替換再您可以內嵌newA()方法。我想,不值得麻煩。但我不知道更自動的方式。

+0

我在想我真的需要這樣做,但不管怎麼樣都要做 – Edge 2012-04-25 14:42:01

0

你爲什麼做這個醜陋的東西?

你爲什麼不這樣做

public void sometMethod(Object.. parameters) 

,您可以訪問它像

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

併爲...你可以使用..反射您的解決方案回答...

您可以使用反射動態地訪問你的方法... link here

2

有沒有辦法做到這一點?

是的,有回報this這樣你就可以把它們連二傳手樣的功能:

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... 
} 

用法:

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

當A)有合理的默認值,這是特別有用幾個「參數」,所以調用者不一定必須使用所有的setter,B)有很多參數,所以很容易按照事物的順序丟失。

我用letXyz而不是setXyz因爲肖恩在評論中指出,setXyz使用JavaBean的命名約定,但JavaBean的制定者不應該有一個返回值。 (更多信息,請參閱this other question here on SO及其答案。)

+0

+1,但我不同意命名。 setXyz建議Java bean方法,它們不是(Java Beans setter可能沒有返回值)。畢竟你正在建造一些東西,我會稱之爲「withXyz」或類似的東西。 – 2012-04-25 08:35:33

+0

@SeanPatrickFloyd:好點。我不喜歡'setFoo'或'withFoo',但名稱不如概念重要。 – 2012-04-25 08:37:15

+0

我想重構它,因爲我最終會改變很多文件。 – Edge 2012-04-25 08:37:16