是否应使用 Java 方法参数来返回多个值?
2022-09-01 17:29:20
由于发送到Java中的方法的参数指向调用方方法中的原始数据结构,因此其设计者是否打算将它们用于返回多个值,就像其他语言(如C)中的规范一样?
或者这是对Java的变量是指针的一般属性的危险误用?
由于发送到Java中的方法的参数指向调用方方法中的原始数据结构,因此其设计者是否打算将它们用于返回多个值,就像其他语言(如C)中的规范一样?
或者这是对Java的变量是指针的一般属性的危险误用?
很久以前,我和 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);
}
在我看来,如果我们谈论的是公共方法,你应该创建一个表示返回值的单独类。当您有单独的类时:
Point
我总是选择返回一个新实例,而不是实际修改传入的值。对我来说,它似乎更清晰,并且有利于不变性。
另一方面,如果它是一种内部方法,我想可以使用以下任何一种:
new Object[] { "str", longValue }
)Arrays.asList(...)
不过,我更喜欢最后一个选项,配备合适的构造函数。如果您发现自己从多个位置返回相同的元组,则尤其如此。