Java Practice:返回作为参数传递的相同对象

时间:2012-01-26 08:15:21

标签: java

在下面的代码中,updateWithContex返回与参数相同的对象是不是很糟糕?

class SomeClass{
   Foo updateWithContex(Foo foo){
       foo.setAppId(i);
       foo.setXId(index);
       //.....
       return foo;
   }
}

class Foo{

    public void setAppId(int appId)
    {
       //
    }
    public void setXId(int appId)
    {
        //
    }
    public void changeState(X x)
    {
       //
    }
}

在C ++中,我见过这样的代码:

 BigObject&
   fastTransform( BigObject& myBO )
   {
      // When entering fastTransform(), myBO is the same object as the function
      // argument provided by the user. -> No copy-constructor is executed.
      // Transform myBO in some way
      return myBO;   // Transformed myBO is returned to the user.
   }

这也错了吗?

4 个答案:

答案 0 :(得分:10)

返回一个对象会建议您的API用户不会更改传入的对象,而是返回一个新的修改对象。为了说明情况并非如此,我建议将返回类型更改为void

答案 1 :(得分:2)

您的代码应如下所示:

class SomeClass{
   void updateWithContex(Foo foo){
       foo.setAppId(i);
       foo.setXId(index);
       //.....
   }
}

这是不好的做法,因为您将引用传递给foo对象,因此您可以在updateWithContex方法中更改它而不将其返回给方法。再一次,请记住,您始终使用Java进行参考。而且可以肯定的是,其他地方无法做到这一点 - 它始终是对象的引用。 Java没有这样的东西:fastTransform(BigObject& myBO)。

答案 2 :(得分:2)

我没有看到任何错误,这是API设计的问题。使用您发布的代码,您可以执行类似

的操作
someClass.updateWithContext(new Foo()).changeState(x);

而不是

Foo foo = new Foo();
someClass.updateWithContext(foo);
foo.changeState(x);

第一个代码段是fluent interface的更好示例,而不是第二个。

答案 3 :(得分:1)

Output Parameters in Java一些对象是可变的,有些是不可变的。这种方法的线程安全性也值得怀疑。它可以完成,但是它通常被认为不是一件好事,谷歌也输出java参数。希望这会有所帮助。