Java通过价值传递; 没有像C#中的out参数。
您可以使用return ,也可以改变作为参考传递的对象( 按值)。
相关问题
Java有类似C#的ref和out关键字吗? ? (没有!)
Java通过引用传递? (没有!)
代码示例
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!" } }
也可以看看
什么是不可改变的?
Java中的StringBuilder和StringBuffer
至于OP需要帮助的代码 ,下面是一个使用特殊值(通常为null用于引用types)的典型解决scheme来指示成功/失败:
代替:
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返回types,用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 (也许是一个空string!),直到它返回null来表示“search”结束。
当然,这并不限于引用types的返回值。 关键是必须有一些特殊的价值永远不是一个有效的价值,你用这个价值的特殊用途。
另一个经典的例子是String.indexOf :它返回-1来表示search失败。
注意 :因为Java没有“input”和“输出”参数的概念,所以使用i-和o-前缀(例如iAddress , oPerson )是不必要和单一的。
更一般的解决scheme
如果您需要返回多个值,通常它们以某种方式相关(例如,单个Point x和y坐标)。 最好的解决scheme是将这些值封装在一起。 人们使用了一个Object[]或一个List ,或者一个普通的Pair ,但是真的,你自己的types是最好的。
对于这个问题,我推荐一个像这样的不可变的SearchResulttypes来封装boolean和Stringsearch结果:
public class SearchResult { public final String name; public final boolean isFound; public SearchResult(String name, boolean isFound) { this.name = name; this.isFound = isFound; } }
然后在你的searchfunction中,你可以做到以下几点:
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; //... }
如果你愿意,你可以(也可能应该)使final不可变字段不public ,并使用public getter。