Java传递价值;没有out参数像C#中。
您可以使用return,或者将作为引用传递的对象(按值)进行mutate。
相关问题
代码示例
public class FunctionSample {
static String fReturn() {
return "Hello!";
}
static void fArgNoWorkie(String s) {
s = "What am I doing???"; // Doesn't "work"! Java passes by value!
}
static void fMutate(StringBuilder sb) {
sb.append("Here you go!");
}
public static void main(String[] args) {
String s = null;
s = fReturn();
System.out.println(s); // prints "Hello!"
fArgNoWorkie(s);
System.out.println(s); // prints "Hello!"
StringBuilder sb = new StringBuilder();
fMutate(sb);
s = sb.toString();
System.out.println(s); // prints "Here you go!"
}
}
也可以看看
至于OP需要帮助的code,下面是使用特殊值(通常为引用类型为null)来指示成功/失败的典型解决方案:
代替:
String oPerson= null;
if (CheckAddress("5556", oPerson)) {
print(oPerson); // DOESN'T "WORK"! Java passes by value; String is immutable!
}
private boolean CheckAddress(String iAddress, String oPerson) {
// on search succeeded:
oPerson = something; // DOESN'T "WORK"!
return true;
:
// on search failed:
return false;
}
请改用String返回类型,用null表示失败。
String person = checkAddress("5556");
if (person != null) {
print(person);
}
private String checkAddress(String address) {
// on search succeeded:
return something;
:
// on search failed:
return null;
}
这就是java.io.BufferedReader.readLine()的工作原理,例如:它返回instanceof String(可能是一个空字符串!),直到返回null表示“搜索”的结束。
当然,这不限于引用类型返回值。关键是,必须有一些特殊的值永远不是有效的值,并且您将该值用于特殊目的。
另一个经典的例子是String.indexOf:它返回-1表示搜索失败。
Note: because Java doesn’t have a concept of “input” and “output” parameters, using the i- and o- prefix (e.g. iAddress, oPerson) is unnecessary and unidiomatic.
一个更通用的解决方案
如果您需要返回多个值,通常它们以某种方式相关(例如单个点的x和y坐标)。最好的解决方案是将这些值封装在一起。人们已经使用Object []或List< Object>,或者一个通用对< T1,T2> ;,但是真的,你自己的类型是最好的。 对于这个问题,我推荐一个不可变的SearchResult类型这样封装的布尔和String搜索结果:
public class SearchResult {
public final String name;
public final boolean isFound;
public SearchResult(String name, boolean isFound) {
this.name = name;
this.isFound = isFound;
}
}
然后在搜索功能中,执行以下操作:
private SearchResult checkAddress(String address) {
// on address search succeed
return new SearchResult(foundName, true);
:
// on address search failed
return new SearchResult(null, false);
}
然后你使用它像这样:
SearchResult sr = checkAddress("5556");
if (sr.isFound) {
String name = sr.name;
//...
}
如果你愿意,你可以(也许应该)使最终的不可变字段不公开,而使用public getter。