如何在Java中使用输出参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

有人可以给我一些示例代码,在函数中使用输出参数吗?我试图Google,但只是在功能上发现它。我想在另一个函数中使用这个输出值。

我正在开发的代码旨在在Android中运行。

提问于
用户回答回答于

Java通过价值传递; out在C#中没有参数。

可以使用return或改变作为参考传递的对象(值)。

代码示例

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用于引用类型)指示成功/失败的典型解决方案:

代替:

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以指示搜索失败。

注意:因为Java没有“输入”和“输出”参数的概念,所以使用i-o-前缀(例如iAddressoPerson)是不必要和单一的。

更通用的解决方案

如果需要返回多个值,通常他们以某种方式(例如与xy单一的坐标Point)。最好的解决方案是将这些值封装在一起。人们使用了一个Object[]或一个List<Object>,或者一个通用的Pair<T1,T2>,但真的,你自己的类型是最好的。

对于这个问题,我推荐一个SearchResult像这样的不可变类型来封装booleanString搜索结果:

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;
  //...
}

如果你愿意,你可以(也可能应该)使final不可变的字段为非public,并且使用publicgetter。

用户回答回答于

Java不支持输出参数。您可以使用返回值,或者传入一个对象作为参数并修改该对象。

扫码关注云+社区