Eclipse方法调用重构

时间:2013-07-10 17:37:51

标签: java eclipse methods refactoring

我正在尝试以下列模式重构一些代码:

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

// to
fooBar(object1, object2) ;

,其中

  • object1是SuperClass的子类型
  • object2是一个字符串
  • fooBar位于需要导入的实用程序类中

对于上下文,更改是由于foo()在某些情况下返回null,这会在调用bar()时导致NullPointerExceptions。 fooBar()首先检查foo()是否返回null,如果返回默认值,则调用bar()并返回。

我正在使用Eclipse,我想知道是否有一种很好的方法可以做到这一点,而不是在文件搜索中使用正则表达式手动更改每一个事件。

编辑 - 回复评论的更多信息:

我无法控制foo()的实现。

关于object1是SuperClass的子类:

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

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

我虽然应该提一下,因为它可能会影响如何搜索object1。

代码之前和之后的[可能]更清晰的版本:

//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 ;
}

1 个答案:

答案 0 :(得分:0)

我发现解决方案甚至花在我生命中的这3年! :)

实际上基于代码重构的解决方案将一个方法调用替换为另一个方法调用。 例: 我们之前:obj1.method1(){}; obj2.method2(obj1){ obj1.method1(); };

在应用eclipse重构“Inline ...”之后,我们将obj2.method2(obj1);的所有电话都替换为电话obj1.method1();

所以对你的情况来说:

  1. 使用方法foo,bar,fooBar;
  2. 的实现制作源文件的备份副本
  3. 然后将fooBar的实现替换为:fooBar(object1,object2){return this; };
  4. 将方法bar()的实现替换为:bar(){return this; };
  5. 将方法foo(object2)的实现替换为:foo(object2){return fooBar(this,object2); };
  6. 然后适用于任何调用bar()eclipse重构“Inline ...”,它只是解散所有bar()调用;
  7. 再次申请“内联...”,可以使用object1.foo(object2)
  8. 替换所有此类来电的fooBar(this,object2);来电
  9. 从备份副本恢复每个方法的实现;
  10. 就是这样!