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();}谢谢!但我的案例与您的回答略有不同(方法链接不是我的问题)。这是有道理的!但它从根本上错了吗?还是仅仅是代码的可读性?这取决于您如何定义“根本错误”。。。这是否使该方法无法使用?不,你的名字会被其他调用你方法的人诅咒吗?可能吧@沃安卓,那么有什么更好的方法来处理这个问题呢?