ins*_*ect 7 java parameter-passing pass-by-reference
从标题中可以清楚地看出我们应该采用哪种方法?
意图是传递一些方法参数并获得输出.我们可以传递另一个参数,方法会更新它,方法现在不需要返回任何东西,方法只会更新输出变量,它会反映给调用者.
我只想通过这个例子来构建问题.
List<String> result = new ArrayList<String>();
for (int i = 0; i < SOME_NUMBER_N; i++) {
fun(SOME_COLLECTION.get(i), result);
}
// in some other class
public void fun(String s, List<String> result) {
// populates result
}
Run Code Online (Sandbox Code Playgroud)
与
List<String> result = new ArrayList<String>();
for (int i = 0; i < SOME_NUMBER_N; i++) {
List<String> subResult = fun(SOME_COLLECTION.get(i));
// merges subResult into result
mergeLists(result, subResult);
}
// in some other class
public List<String> fun(String s) {
List<String> res = new ArrayList<String>();
// some processing to populate res
return res;
}
Run Code Online (Sandbox Code Playgroud)
我明白一个人通过了参考而另一个没有.
我们应该选择哪一种(在不同情况下)以及为什么?
更新:仅考虑可变对象.
Jef*_*rey 16
从函数返回值通常是编写代码的更简洁的方法.由于创建和销毁指针的性质,传递值并修改它是更多的C/C++风格.
开发人员通常不希望通过传递函数来修改它们的值,除非函数明确声明它修改了值(我们经常浏览文档).
但也有例外.
考虑一下这个例子Collections.sort,它实际上确实做了一个列表.想象一下包含100万件物品的清单,你正在对它进行分类.也许你不想创建另外有100万条目的第二个列表(即使这些条目指向原始条目).
支持使用不可变对象也是一种好习惯.不可变对象在开发的大多数方面(例如线程)导致的问题要少得多.因此,通过返回一个新对象,您不会强制参数变为可变.
重要的是要明确你在方法中的意图.我的建议是尽可能避免修改参数,因为它不是Java中最典型的行为.
你应该退货.你提供的第二个例子是要走的路.
首先,它更清楚.当其他人阅读您的代码时,他们可能没有注意到参数被修改为输出.您可以尝试命名变量,但是在代码可读性方面,它更可取.
你应该返回而不是传递它的大原因是使用不可变对象. 你的例子,List,是可变的,所以它可以正常工作.但是如果你试图以这种方式使用String,它将无法工作.
由于字符串是不可变的,如果你将一个字符串作为参数传递,然后该函数说:
public void fun(String result){
result = "new string";
}
Run Code Online (Sandbox Code Playgroud)
您传入的结果值不会被更改.相反,本地范围变量'result'现在指向fun里面的新字符串,但是调用方法中的结果仍然指向原始字符串.
如果你打电话:
String test = "test";
fun(test);
System.out.println(test);
Run Code Online (Sandbox Code Playgroud)
它将打印:"测试",而不是"新字符串"!
所以当然,它优于回归.:)
| 归档时间: |
|
| 查看次数: |
11012 次 |
| 最近记录: |