在下面的代码中,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.
}
这也错了吗?
答案 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参数。希望这会有所帮助。