返回值-Java API设计VS. C API

时间:2015-06-22 13:36:52

标签: java api

之前我使用过C,现在使用Java。我对JAVA中的API设计有疑问。 在C中,我总是使用int作为有意义的返回值,并在参数中放置多个对象(其中一些将被更改)。例如,

int foo(int x, int y, int *result)
{
     *result=x+y;
     return SUCCESS;
}

在Java中,通过引用传递似乎是模糊的,将返回的对象放在参数中是好的吗?例如,

Class Person{
   ...
}

两个API:

public Person bar()          // return value is the object 

VS

public int bar(Person p)     // return value is passed by reference

此外,如何在一个功能中更改多个对象?返回列表可能不是很优雅。

public int zoo(Person p, Alien x)   // both p and x will be changed

EDIT1

这个问题归结为两个问题。

1)如果我们想在一个函数中更改对象,这些对象应该在参数中传递(作为可变对象)?

2)调用者如何通过返回代码或其他(如异常)知道返回状态?

2 个答案:

答案 0 :(得分:2)

一个主要的区别是Java从一开始就有异常和异常处理。这意味着没有必要返回“SUCCESS”。如果它完全返回,而不是抛出异常,那就成功了。

Java 具有pass-by-reference。它的功能是指针。当您调用public int bar(Person p)之类的方法时,p是指向Person对象的指针,除非它为null。

答案 1 :(得分:1)

如果要返回多个对象,则应该为返回值定义一个类。他们很有可能是相关的,并且暗中寻找一个住在一起的家。另一个选择是使用Pair类(Apache commons lang)或List,但这很麻烦并且要避免使用。

您应该避免传入参数以通过引用进行修改,因为参数传递的语义可能因RPC类型调用而不同,甚至取决于容器配置(换句话说,您不能保证将结果作为参数返回为它最终可能是按值调用的。)

就返回代码而言:您通常不需要它们。如果有错误则抛出异常,否则成功。如果您有不同类型的成功,则可能需要返回复杂对象或对象层次结构。如果要返回某种整数状态代码,则可能表示某种反模式。