是否应使用 Java 方法参数来返回多个值?

2022-09-01 17:29:20

由于发送到Java中的方法的参数指向调用方方法中的原始数据结构,因此其设计者是否打算将它们用于返回多个值,就像其他语言(如C)中的规范一样?

或者这是对Java的变量是指针的一般属性的危险误用?


答案 1

很久以前,我和 Ken Arnold(Java 团队的一名成员)有过一次对话,这可能是在 1996 年的第一届 Java One 大会上。他说,他们正在考虑添加多个返回值,这样你就可以写这样的东西:

x, y = foo();

当时和现在,建议的方法是创建一个具有多个数据成员的类,并返回该类。

基于此,以及那些在Java上工作的人发表的其他评论,我会说你的意图是/是你返回一个类的实例,而不是修改传入的参数。

这是常见的做法(就像C程序员修改参数的愿望一样......最终,他们通常会看到Java的制作方式。只需将其视为返回结构即可。:-)

(根据以下评论编辑)

我正在读取一个文件并生成两个数组,类型为 String 和 int,从每行中为两者选取一个元素。我想将它们两个都返回到任何调用它的函数,该函数以这种方式拆分哪个文件。

我想,如果我对你的理解是正确的,我可能会这样做:

// could go with the Pair idea from another post, but I personally don't like that way
class Line
{
    // would use appropriate names
    private final int intVal;
    private final String stringVal;

    public Line(final int iVal, final String sVal)
    {
        intVal    = iVal;
        stringVal = sVal;
    }

    public int getIntVal()
    {
        return (intVal);
    }

    public String getStringVal()
    {
        return (stringVal);
    }

    // equals/hashCode/etc... as appropriate
}

然后让你的方法像这样:

public void foo(final File file, final List<Line> lines)
{
    // add to the List.
}

然后这样称呼它:

{
    final List<Line> lines;

    lines = new ArrayList<Line>();
    foo(file, lines);
}

答案 2

在我看来,如果我们谈论的是公共方法,你应该创建一个表示返回值的单独类。当您有单独的类时:

  • 它用作抽象(即一个类而不是两个长整型的数组)Point
  • 每个字段都有一个名称
  • 可以变得不可变
  • 使API的演变变得更加容易(即返回3而不是2个值,更改某些字段的类型等)。

我总是选择返回一个新实例,而不是实际修改传入的值。对我来说,它似乎更清晰,并且有利于不变性。

另一方面,如果它是一种内部方法,我想可以使用以下任何一种:

  • 数组 (new Object[] { "str", longValue })
  • 列表(返回不可变列表)Arrays.asList(...)
  • 对/元组类,例如
  • 静态内部类,具有公共字段

不过,我更喜欢最后一个选项,配备合适的构造函数。如果您发现自己从多个位置返回相同的元组,则尤其如此。