我有时(实际上,经常)发现自己使用一个单元素数组来从一个方法返回多个值。如下所示:
public static int foo(int param1, int param2[], String param3[])
{
// method body
....
// set return values
param2[0] = <some value>;
param3[0] = <some value>;
return <some value>;
}这是一种糟糕的做法吗?(这似乎是因为我的一些朋友说他们在2秒内不知道它在做什么!)但我最初使用它的原因是因为它看起来最接近C++中的pass-by-reference。而且这种做法在C++中并不被鼓励,所以...
但如果这真的是一种错误的做法,你知道如何以一种干净的方式重写它吗?
谢谢
发布于 2013-02-12 05:12:10
虽然我同意这里的普遍观点,即为这种目的使用数组是不好的做法,但我想补充几点。你确定“通过引用传递”真的是你首先需要的吗?很多人说你的代码是糟糕的风格,但现在让我告诉你为什么这是IMHO。“通过引用传递”主要是“副作用编程”的同义词,这是你总是想要避免的事情。这使得代码更难调试和理解,在多线程环境中,这种态度的不良影响确实会对您造成沉重打击。要在Java中编写可伸缩和线程安全的代码,您应该尽可能地将对象设置为“只读”,即理想情况下,您可以同时创建一个对象并对其进行初始化,然后在整个应用程序中以这种不可修改的状态使用它。对状态的逻辑更改几乎总是可以被认为是对新状态的“创建”,即创建一个初始化为当时需要的状态的新实例。许多现代脚本语言只允许你以这种方式工作,这使得事情变得更容易理解。与C++相反,Java在分配和释放短期对象方面要高效得多,所以这里的其他人的建议实际上没有错:创建一个特殊类的实例来保存函数结果,只是为了返回结果。即使您在循环中执行此操作,JVM也将足够智能,能够有效地处理此问题。Java只会在需要时以非常大的块从操作系统分配内存,并且将在内部处理对象的创建和释放,而不会像C/C++这样的语言涉及的开销。“按引用传递”在Java中真的帮不了你多少忙。
编辑:我建议您在论坛或网络上搜索“副作用”、“函数式编程”或“不变性”等术语。这很可能会为你的问题打开一个新的视角。
发布于 2013-02-12 04:21:56
创建一个包含要返回的数据的对象。
然后,您可以返回该对象的实例。
class FooData {
private int someInt;
private int anotherInt;
private String someString;
public FooData(int a, int b, String c) {
someInt = a;
anotherInt = b;
someString = c;
}
}
public FooData foo() {
// do stuff
FooData fd = new FooData(blah, blahh, blahhh);
return fd;
}发布于 2013-02-12 04:22:19
我认为,使用作为方法参数的单元素数组“返回”值是一种糟糕的做法。
这是关于这个主题的another SO question。简而言之,它对可读性非常不利。
有一个简单的解决办法:将您希望返回的所有值包装在专门为此目的定义的类中,然后返回该类的一个实例。
return new ValueHolder(someValue1, someValue2, someValue3);https://stackoverflow.com/questions/14820115
复制相似问题