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

soc*_*ose 59 java parameters android

有人可以给我一些在函数中使用输出参数的示例代码吗?我试过谷歌它,但只是在功能中找到它.我想在另一个函数中使用此输出值.

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

pol*_*nts 106

Java按值传递; 没有outC#中的参数.

您可以使用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!"
    }

}
Run Code Online (Sandbox Code Playgroud)

也可以看看


至于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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这是如何java.io.BufferedReader.readLine()工作的,例如:它返回instanceof String(可能是一个空字符串!),直到它返回null以指示"搜索"结束.

当然,这不限于参考类型返回值.关键是必须有一些永远不是有效值的特殊值,并且您将该值用于特殊目的.

另一个经典示例是String.indexOf:它返回-1以指示搜索失败.

:因为Java没有"输入"和"输出"的参数,使用的概念i-o-前缀(如iAddress,oPerson)是不必要的,unidiomatic.


更通用的解决方案

如果您需要返回多个值,通常它们会以某种方式相关(例如x,y单个坐标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;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在搜索功能中执行以下操作:

private SearchResult checkAddress(String address) {
  // on address search succeed
  return new SearchResult(foundName, true);
  :
  // on address search failed
  return new SearchResult(null, false);
}
Run Code Online (Sandbox Code Playgroud)

然后你像这样使用它:

SearchResult sr = checkAddress("5556");
if (sr.isFound) {
  String name = sr.name;
  //...
}
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您可以(并且可能应该)将final不可变字段设为非public,并使用publicgetter代替.


Sin*_*hot 6

Java不支持输出参数.您可以使用返回值,或将对象作为参数传入并修改对象.


med*_*pal 5

您可以使用:

  • 返回X。这将仅返回一个值。

  • 返回对象。将返回一个完整的对象。例如,您的对象可能包含X,Y和Z值。

  • 传递数组。数组通过引用传递。即,如果您传递整数数组,在方法内部修改了数组,则原始代码将看到更改。

传递数组的示例。

void methodOne{
    int [] arr = {1,2,3};
    methodTwo(arr);
    ...//print arr here
}
void methodTwo(int [] arr){
    for (int i=0; i<arr.length;i++){
         arr[i]+=3;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将打印出:4,5,6。


Wol*_*ahl 5

作为一种解决方法,可以使用通用的"ObjectHolder".请参阅下面的代码示例

示例输出是:

name: John Doe
dob:1953-12-17
name: Jim Miller
dob:1947-04-18
Run Code Online (Sandbox Code Playgroud)

所以Person参数已被修改,因为它被包装在Holder中,它通过值传递 - 内部的泛型param是一个可以修改内容的引用 - 所以实际上返回了一个不同的人并且原始保持原样.

/**
 * show work around for missing call by reference in java
 */
public class OutparamTest {

 /**
  * a test class to be used as parameter
  */
 public static class Person {
   public String name;
     public String dob;
     public void show() {
      System.out.println("name: "+name+"\ndob:"+dob);
   }
 }

 /**
  * ObjectHolder (Generic ParameterWrapper)
  */
 public static class ObjectHolder<T> {
    public ObjectHolder(T param) {
     this.param=param;
    }
    public T param;
 }

 /**
  * ObjectHolder is substitute for missing "out" parameter
  */
 public static void setPersonData(ObjectHolder<Person> personHolder,String name,String dob) {
    // Holder needs to be dereferenced to get access to content
    personHolder.param=new Person();
    personHolder.param.name=name;
    personHolder.param.dob=dob;
 } 

  /**
   * show how it works
   */
  public static void main(String args[]) {
    Person jim=new Person();
    jim.name="Jim Miller";
    jim.dob="1947-04-18";
    ObjectHolder<Person> testPersonHolder=new ObjectHolder(jim);
    // modify the testPersonHolder person content by actually creating and returning
    // a new Person in the "out parameter"
    setPersonData(testPersonHolder,"John Doe","1953-12-17");
    testPersonHolder.param.show();
    jim.show();
  }
}
Run Code Online (Sandbox Code Playgroud)