【问题标题】:List as output parameter in Java列表作为Java中的输出参数
【发布时间】:2012-07-20 14:12:01
【问题描述】:

我正在尝试编写一个以 List 对象作为输出参数的 Java 函数。

boolean myFunction(int x, in y, List myList)
{
    ...Do things...
    myList=anotherList.subList(fromIndex, toIndex);
    return true
}

在调用函数之前,我声明 myList 如下: 列出 myList=null; 然后我调用函数 myFunction(x,y,myList) 但是当我尝试操作 myList 时,我发现 myList 仍然为空。

我确定我的函数代码中的变量“antherList”不为空,并且我确定 subList 函数返回一个非空列表。

是什么原因,如何在 Java 函数中将 List 作为输出参数传递? 非常感谢。

【问题讨论】:

    标签: java list function-calls output-parameter


    【解决方案1】:

    Java 总是使用按值传递。这意味着操作传递的变量不会影响调用者传递的变量。

    为了解决您的问题,有一些可能性:

    • 返回子列表:

      List myFunction(int x, int y) { return anotherList.subList(....);}
      

      我知道这种方式可以消除您的布尔返回值。

    • 创建一个结构来保存指向 List 和的指针。

      class Reference <T>
      {
          public T ref;
      }
      
      boolean myFunction(int x, int y, Reference<List> listRef)
      {
            listRef.ref = anotherList.subList(....);
            return true;
      }
      
    • 创建一个结构来保存您希望该方法返回的所有输出:

      class MyFunctionOutput
      {
           List list;
           boolean b;
      }
      
      MyFunctionOutput myFunction(int x, int y)
      {
           MyFunctionOutput out = new MyFunctionOutput();
           out.list = anotherList.subList(....);
           out.b = true;
           return out;
      }
      
    • 或者最简单的方法:传递一个初始化的 List 而不是 null 并让函数添加子列表,就像 Attila 建议的那样。

    【讨论】:

      【解决方案2】:

      您不能在 Java 中传递 out 参数。您需要将返回类型声明为 List 或更改传递列表的 内容

      boolean myFunction(int x, in y, List myList) 
      {
        ...Do things... 
        myList.clear();
        myList.addAll(anotherList.subList(fromIndex, toIndex)); 
        return true 
      } 
      

      注意:out-parameter 意味着你改变了包含传递给函数的值的变量的值。在您的情况下,这意味着返回一个不同的 List 对象。相反,您返回的是 same List 对象,但内容已更改。

      将参数视为传递值的本地副本:替换整个对象的任何更改都将在函数返回时丢失。如果您只是更改其内容/状态,则该更改将在您访问传入的同一对象时保留(本地副本由指向同一对象的引用组成)

      注意:这可能是出于演示目的,但您应该使用泛型来指定列表包含的对象:例如List&lt;String&gt; 而不是原始的 List 类型

      【讨论】:

        【解决方案3】:
        Java中的

        引用是按值传递的。所以你不能指定 out 参数

        你可以做的(但是)是改变一个传入的对象。所以在上面的例子中,你可以传入一个空的List,并在你调用的方法中填充它。

        即在上面:

        myList.addAll(...);
        

        您可能希望断言传递的列表为空作为先决条件。

        我可能会建议这在 Java 世界中不是很常见的模式。因为 out 参数 不存在,所以作为参数传入的参数不会发生变化,这不是预期的行为,您最好创建一个合适的对象类型来返回。

        【讨论】:

          【解决方案4】:

          myList 变量是该函数的本地变量。引用是按值传递的,而不是 Java 世界中的指针。一旦退出,它就会从上下文堆栈中删除。一个可能的选择是不返回布尔值,而是返回列表本身。然后您可以测试该列表是否为 null 以查看您的功能是否有效。

          另一种选择是实际创建您的列表,然后将其传递给函数(非空)。然后你的函数不需要创建一个新列表,而只需向它添加值。

          【讨论】:

            【解决方案5】:

            一个简短的答案 - 只需将新列表作为函数的返回值返回:

            List myFunction(int x, in y, List myList) {
                ...Do things...
                return anotherList.subList(fromIndex, toIndex);
            }
            

            长答案是,当您调用函数时,java 会复制对象的指针,这意味着如果您将新对象分配给方法参数,它不会影响原始变量。因此,如果要更改对象值,则必须保存参数引用。

            【讨论】:

              猜你喜欢
              • 2011-01-14
              • 2020-04-14
              • 1970-01-01
              • 1970-01-01
              • 2014-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-09
              相关资源
              最近更新 更多