2013-07-10 25 views
1

我試圖重構在以下模式的一些代碼:Eclipse的方法調用重構

// from 
object1.foo(object2).bar() ; 

// to 
fooBar(object1, object2) ; 

其中

  • object1是父類
  • 的亞型
  • 對象2是一個String
  • fooBar處於需要導入的公用類中

對於上下文,更改是由於foo()在某些情況下返回null,當調用bar()時導致NullPointerExceptions。
fooBar()首先檢查foo()是否返回null,如果是,則返回默認值,否則調用bar()並返回該值。

我使用Eclipse,我想知道是否有一個好的方法來做到這一點,而不是使用正則表達式在文件搜索或其他方面手動更改每個事件。

編輯 - 響應評論更多信息:

我不擁有控制權的foo()的實現。

關於object1是父類的子類:

//in some cases this happens 
SuperClass object1 = new SuperClass(/*whatever*/) ; 

//in other cases this happens 
ChildClass object1 = new ChildClass (/*whatever*/) ; 

不過,我覺得我應該提到它,因爲它可能會影響如何搜索object1。

A [也許]更清晰版的前後代碼之後:

//before 
Object result = object1.foo("a string").bar() ; 
//NullPointerException if foo() returns null! :(

//after 
Object result = fooBar(object1, "a string") ; 

同時,在一個單獨的實用工具類,存在:

public static Object fooBar(SuperClass obj, String str) { 
    Object result = DEFAULT_RESULT ; 

    if (obj != null && str != null && obj.fooAble(str)) { 
     result = obj.foo(str).bar() ; 
    } 

    return result ; 
} 
+0

您爲每個對象放置一個foo,而對所有對象放置一個foobar?當然減少需要的內存。每個對象至少4個字節。 –

+0

在代碼object1的類型中的某些事件中是SuperClass;在其他情況下,object1的類型顯式爲ChildClass,即SuperType的子類。 – bosticko

+0

你有控制'foo'的實現嗎?讓它永遠不會返回null會更容易 - 而是返回一個默認實例,bar()只返回默認值。 – Dathan

回答

0

我找到解決方案,即使花在這個3年我生命中的! :)

實際上基於代碼重構的解決方案將一個方法調用替換爲另一個。 例子: 之前,我們有:obj1.method1(){};obj2.method2(obj1){ obj1.method1(); };

應用日食重構「內聯後...「我們將與呼叫你的情況下更換obj1.method1();

所以obj2.method2(obj1);每個電話:

  1. 使源文件的備份副本與實現方法FOO,酒吧,Foobar的;
  2. 然後替換實施將fooBar(object1,object2){return this;};
  3. 將方法bar()的實現替換爲:bar(){return this;};
  4. 將方法foo(object2)的實現替換爲:foo (object2){return fooBar(此,Object2的); };
  5. 然後適用於bar()eclipse重構「Inline ...」的任何調用,它只是消除所有bar()調用;
  6. 再次申請「內聯......」對於與fooBar(this,object2);
  7. 取代所有這些電話object1.foo(object2)任何呼叫恢復實現從備份每種方法的;

就是這樣!