我正在尝试以下列模式重构一些代码:
// from
object1.foo(object2).bar() ;
// to
fooBar(object1, object2) ;
,其中
对于上下文,更改是由于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 ;
}
答案 0 :(得分:0)
我发现解决方案甚至花在我生命中的这3年! :)
实际上基于代码重构的解决方案将一个方法调用替换为另一个方法调用。
例:
我们之前:obj1.method1(){};
obj2.method2(obj1){ obj1.method1(); };
在应用eclipse重构“Inline ...”之后,我们将obj2.method2(obj1);
的所有电话都替换为电话obj1.method1();
所以对你的情况来说:
object1.foo(object2)
fooBar(this,object2);
来电
就是这样!