import java.util.ArrayList;
public class test {
public static void main(String[] args) {
ArrayList<String> x = new ArrayList<String>();
x.add("null");
modify(x);
System.out.println (x.get(0));
}
public static void modify(ArrayList<String> y) {
y.set(0, "This is a piece of string.");
}
}
结果:This is a piece of string.
规避需要传引用的方法
Java在语言设计上之所以要排除传引用的方式是有很好的原因的。并且在写Java应用程序的时候,我们最好遵从Java的这个习惯。对在其它语言中采用引用传递来解决的所有一般性的问题,Java都有一流的解决方案。在我讨论它们以前,让我们来看看引用传递的一些毛病。
引用传递将代码的输入和输出混在了一起。这是这项技术的最基本的问题所在。在Java中,广州java培训班程序员可以假设变量在作为参数传入到方法中时其值不会改变。在拥有引用传递语义的语言中,这个基本的假设是不成立的。
引用传递混淆了方法的接口。使用引用传递语义书写的方法拥有很复杂的接口,这样客户程序员很难学习和理解。有人说,在应用中你可能会遇到你觉得非常需要使用引用传递的情况。我们使用引用传递有两个主要的原因,并且每一个都有解决的办法:
首先,在许多语言中引用传递被用来减少函数调用的成本,防止出现拷贝大量数据的情况。在Java中这不是个问题。在Java中给方法传递的值是原始数据类型或者对象的引用,问题就被轻而易举地解决了,因为这两种值都不是很大。对象本身可以很大,但是它永远都不会被传递给方法。
其次,引用传递允许变量被改变,并且改变的值在客户端代码中可见。解决的办法是重构应用程序,使用返回值来达到这个目的。如果参数是一个“输入-输出”参数,那么它的原值应该传入到方法中,而它的结果应该移动到返回值中去。客户端代码可能会像下面这样:
a = someMethod(a);
这是在很多场合使用引用传递的真正原因——它允许方法高效地拥有多个返回值。Java不允许有多个“实”返回值,并且它也不允许在其它单一返回值语言中用到的引用传递方式。但是,这里有一些办法来解决这个问题:
如果你的任一返回值是用于显示方法成功或失败执行的状态代码,立刻将它们删除。使用异常处理机制来替代它们,如果代码没有成功完成抛出一个异常。异常是更标准的处理错误情况的方式,它不仅更富于表现力,而且多可以排除你的一种返回值。
找到相关的返回值组,将它们封装到对象中去,而每条信息作为这个对象的一个字段。这些对象的类可以在将来封装更多的行为,大大提升了代码的设计。封装到对象中的每个返回值的集合,可以通过提升方法接口抽象级别的方式来从方法中移除返回值。例如,与其将协调工作的X和Y以引用的方式传递,以达到能够同时返回的目的,不如创建一个可以变化的指向类,通过值来传递对象引用,并且在方法中更新对象的值。
如果你发觉你需要传递一个对象,然后再返回这个对象的新版本,并且这个对象是可变的,那么你可以考虑将方法移到对象的类中去,使其成为这个类成员函数。这个可以提高设计的封装性和简化接口。
如果在以上步骤后,你依然需要方法有多个返回值,那么把这个方法分成若干个不同的子方法,每个子方法返回原来一部分的返回值。与一个大方法比起来,使用这样的方法集合会使客户代码更加清晰。