我使用“引入参数”重构了我的方法,因为它接受了很多变量。但现在所有的调用者都有内联的cosntructor
this.somemethod(new MyParam("a", "b","c","d");
我想通过用像
这样的setter替换构造函数来重构它MyParam myParam= new MyParam();
myParam.setA("a");........
.
.
this.somemethod(myParam);
有没有办法做到这一点?
在eclipse https://bugs.eclipse.org/bugs/show_bug.cgi?id=105324
上报告了类似的错误答案 0 :(得分:2)
有没有办法做到这一点?
是的,有类似setter的函数返回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
,因为正如Sean在评论中指出的那样,setXyz
使用JavaBean命名约定,但JavaBean setter不应该有返回值。 (有关更多信息,请参阅this other question here on SO及其答案。)
答案 1 :(得分:0)
你为什么要做这件丑事?
你为什么不做像
这样的事情public void sometMethod(Object.. parameters)
您可以像
一样访问它this.someMethod("a", "b", "c", "d", "e", "f"); //:)
//or
this.someMethod("a");
要回答你的解决方案......你可以......使用反思......
您可以使用反射动态访问您的方法...... link here
答案 2 :(得分:0)
如果我理解正确,您希望自动从当前构造函数转到无参数构造函数,并随后调用setter。我会通过将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()
方法。我想,我觉得很难受。但我不知道更自动化的方式。