【问题标题】:refactor constructors into setters in java在java中将构造函数重构为setter
【发布时间】:2014-01-07 01:48:35
【问题描述】:

我使用“引入参数”重构了我的方法,因为它接受了很多变量。但是现在所有的调用者都将内联构造函数作为

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 上报告了一个类似的错误

【问题讨论】:

  • 您确定要这样做吗?也许您想将 MyParam 拆分为多个类...
  • 基本上我不喜欢冗长的代码,因为它真的很难阅读,也很难理解传递了哪些参数

标签: java eclipse refactoring


【解决方案1】:

有没有办法做到这一点??

是的,具有返回 this 的类似 setter 的函数,因此您可以将它们链接起来:

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 在 cmets 中指出的那样,setXyz 使用 JavaBean 命名约定,但 JavaBean 设置器不应该有返回值。 (有关更多信息,请参阅this other question here on SO 及其答案。)

【讨论】:

  • +1 但我不同意命名。 setXyz 建议 Java bean 方法,但它们不是(Java Beans setter 可能没有返回值)。毕竟你正在构建一些东西,我会称这些方法为“withXyz”或类似的东西。
  • @SeanPatrickFloyd:好点。我不喜欢setFoowithFoo,但名称不如概念重要。
  • 我想通过重构来实现它,否则我最终会更改很多文件。
  • @Edge:啊,好吧,这是一个 Eclipse 问题,而不是 Java 或软件设计问题。对不起,我误解了。不知道Eclipse有没有这种重构;我倾向于不这么认为,但我不使用 Eclipse。我认为一个好的正则表达式搜索和替换或sed 脚本应该能够为您更改这些内容,而不必手动进行。
  • @SeanPatrickFloyd:我选择了letFoo,并链接到另一个解释原因的 SO 问题。 :-) 谢谢。
【解决方案2】:

如果我理解正确,您希望自动从当前构造函数获取无参数构造函数,并随后调用设置器。为此,我将 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() 方法。几乎不值得费心,我想。但我不知道更自动化的方法。

【讨论】:

  • 我在想我真的需要这样做,但还是谢谢
【解决方案3】:

你为什么要做这种丑事?

你为什么不做类似的事情

public void sometMethod(Object.. parameters)

你可以像这样访问它

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

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

您可以使用反射动态访问您的方法...link here

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 2011-07-10
    • 1970-01-01
    • 2013-04-16
    • 2011-06-21
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多