修改并返回传递的参数

时间:2016-12-14 07:14:54

标签: java refactoring software-design

我的代码类似于修改并返回传递的对象参数的方法。

我强烈地看起来像一个糟糕的代码味道。

public class Creator {
  public MyClass create(MyClass param) {

    SomeClass attr1 = createAttr1();
    SomeClass attr2 = createAttr2();
    //... more creation

    param.setAttr1(attr1);
    param.setAttr2(attr2);
    //... set other created attributes.

    return param;
  }
}


public class MyApp {
  public static void main(String[] args) {
    Creator creatorProcesss = new Creator();
    MyClass myClass = new MyClass();
    myClass = creatorProcesss.create(myClass);
  }
}

有没有正确的方法来重构它?

3 个答案:

答案 0 :(得分:4)

您可以将方法的返回类型更改为void,使用情况将变为:

creatorProcesss.create(myClass);

或者更好:

creatorProcesss.initialize(myClass);

因为您的方法没有创建新实例,所以它会初始化传递的实例。

您也可以撤消该流程 - 在initialize中使用MyClass方法接受Creator参数并修改当前的MyClass实例。

然后你main会成为:

Creator creatorProcesss = new Creator();
MyClass myClass = new MyClass();
myClass.initialize(creatorProcesss);

答案 1 :(得分:0)

传递引用时,只需将签名定义为void,而不是返回相同的引用。或者,您可以根据方法内的操作成功返回布尔标志。

public class Creator {
  public void create(MyClass param) {

    SomeClass attr1 = createAttr1();
    SomeClass attr2 = createAttr2();
    //... more creation

    param.setAttr1(attr1);
    param.setAttr2(attr2);
    //... set other created attributes.

    return;
  }
}

答案 2 :(得分:0)

我同意它看起来像一个讨厌的代码味道 - 特别是,你通过这样做引入side-effects

另外,为什么需要创建对象(看似是半初始化的状态),然后再进行修改?在尝试使用它之前,我可能会尝试找到一种完全初始化对象的方法 - 可能是通过使用工厂,或Builder Pattern(为了完全公开,这个链接指向我自己的一篇文章) 。