重构构造函数到java中的setter

时间:2012-04-25 08:27:09

标签: java eclipse refactoring

我使用“引入参数”重构了我的方法,因为它接受了很多变量。但现在所有的调用者都有内联的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

上报告了类似的错误

3 个答案:

答案 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()方法。我想,我觉得很难受。但我不知道更自动化的方式。