【发布时间】:2013-07-10 17:37:51
【问题描述】:
我正在尝试按照以下模式重构一些代码:
// from
object1.foo(object2).bar() ;
// to
fooBar(object1, object2) ;
在哪里
- object1 是 SuperClass 的子类型
- object2 是一个字符串
- fooBar 属于需要导入的实用程序类
对于上下文,更改是由于 foo() 在某些情况下返回 null,这会在调用 bar() 时导致 NullPointerExceptions。
fooBar() 首先检查 foo() 是否会返回 null,如果是则返回默认值,否则调用 bar() 并返回。
我正在使用 Eclipse,我想知道是否有一种好方法可以做到这一点,而不是在文件搜索中使用正则表达式手动更改每次出现的情况。
编辑 - 响应 cmets 的更多信息:
我无法控制 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 ;
}
【问题讨论】:
-
您为每个对象放置一个 foo 而为所有对象放置一个 foobar?当然会减少所需的内存。每个对象至少 4 个字节。
-
在代码中的某些情况下 object1 的类型是 SuperClass;在其他情况下,object1 的类型明确地是 ChildClass,SuperType 的子类。
-
你对
foo的实现有控制权吗?让它永远不返回 null 会更容易——而是返回一个默认实例,bar()只返回默认值。 -
我已添加更多信息以响应您的 cmets。谢谢!
-
@huseyintugrulbuyukisik 我不确定你的意思。如果你的意思是改变 foo() 的实现,我不能。如果您的意思是每次都进行空值检查,我正在尝试通过使用实用程序方法来最大程度地减少代码重复。
标签: java eclipse methods refactoring