0

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

4

3 回答 3

3

有没有办法做到这一点?

是的,具有返回的类似 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) 几个“参数”有合理的默认值,因此调用者不一定必须使用所有的设置器,并且 B) 有很多参数,所以很容易按顺序迷失事物。

我使用letXyz了而不是setXyz因为正如 Sean 在评论中指出的那样,setXyz使用 JavaBean 命名约定,但 JavaBean 设置器不应该有返回值。(有关更多信息,请参阅此处有关 SO及其答案的其他问题。)

于 2012-04-25T08:33:14.800 回答
0

你为什么要做这种丑陋的事情?

你为什么不做类似的事情

public void sometMethod(Object.. parameters)

你可以像这样访问它

this.someMethod("a", "b", "c", "d", "e", "f"); //:)
//or
this.someMethod("a");

并回答你的解决方案......你可以......使用反射......

您可以使用反射动态访问您的方法...链接在这里

于 2012-04-25T08:31:28.487 回答
0

如果我理解正确,您希望自动从当前构造函数获取无参数构造函数,并随后调用设置器。我将通过将 setter 调用放入当前构造函数中来做到这一点,确保它们都是public,然后在构造函数上运行内联方法重构。啊,但 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()。几乎不值得费心,我想。但我不知道更自动化的方式。

于 2012-04-25T14:09:04.077 回答