Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java实践:返回作为参数传递的相同对象_Java - Fatal编程技术网

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

Java实践:返回作为参数传递的相同对象,java,Java,在下面的代码中,updateWithContex返回作为参数的同一个对象,这真的是一种糟糕的做法吗 class SomeClass{ Foo updateWithContex(Foo foo){ foo.setAppId(i); foo.setXId(index); //..... return foo; } } class Foo{ public void setAppId(int appId) {

在下面的代码中,
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.
   }

这也是错误的吗?

您的代码应该如下所示:

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

这是一种不好的做法,因为您将引用传递给foo对象,因此可以在updateWithContex方法中更改它,而无需将其返回方法。再一次,请记住,您总是使用Java进行引用。因此,当然,没有办法在其他地方这样做——它总是对一个对象的引用。Java没有这样的东西:fastTransform(BigObject&myBO)。

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

someClass.updateWithContext(new Foo()).changeState(x);
而不是

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

第一个代码段是一个比第二个更好的示例。

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

有些对象是可变的,有些是不可变的。这种方法的线程安全性也值得怀疑。这是可以做到的,但是的,这通常被认为不是一件好事,谷歌也可以为输出java参数提供帮助。希望这能有所帮助。

方法链接有点不同,您返回的是对调用方法的对象的引用,而不是像本例中那样作为参数传递的对象。@buc:True,很好。我太快了,那么fwiw,我希望updateWithContext是私有的,在这个程度上,返回类型并不是非常重要。如果有公共方法来修改FoO的内部状态,我会把这些声明为FoO的无效成员。我知道java引用是如何工作的,这就是为什么我提供C++ RIFS来阐明需求的原因。我的问题是:为什么返回相同的Foo是错误的。当我们使用程序集编程时,相同的注册表更改并被推回,为什么不使用Java?@yadab-因为这很混乱,可能会导致代码出现缺陷。想象一下你可以这样写:Foo updateWithContex(Foo-Foo){Foo.setAppId(i);return new Foo();}谢谢!但我的案例与您的回答略有不同(方法链接不是我的问题)。这是有道理的!但它从根本上错了吗?还是仅仅是代码的可读性?这取决于您如何定义“根本错误”。。。这是否使该方法无法使用?不,你的名字会被其他调用你方法的人诅咒吗?可能吧@沃安卓,那么有什么更好的方法来处理这个问题呢?