日期:2011-03-22 16:17:00 来源:本站整理
java别名问题[Java编程]
本文“java别名问题[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
“别名”意味着多个句柄都试图指向同一个对象,就象前面的例子展示的那样.若有人向那个对象里写入一点什么东西,就会产生别名问题.若其他句柄的全部者不但愿那个对象改变,恐怕就要绝望了.这可用下面这个简单的例子阐明:
对下面这行://: Alias1.java // Aliasing two handles to one object public class Alias1 { int i; Alias1(int ii) { i = ii; } public static void main(String[] args) { Alias1 x = new Alias1(7); Alias1 y = x; // Assign the handle System.out.println("x: " + x.i); System.out.println("y: " + y.i); System.out.println("Incrementing x"); x.i++; System.out.println("x: " + x.i); System.out.println("y: " + y.i); } } ///:~
Alias1 y = x; // Assign the handle
它会新建一个Alias1句柄,但不是把它分配给由new成立的一个新颖对象,而是分配给一个现有的句柄.所以句柄x的内容——即对象x指向的地址——被分配给y,所以无论x还是y都与相同的对象衔接起来.这样一来,一旦x的i在下述语句中增值:
x.i++;
y的i值也必定遭到影响.从终究的输出便可以看出:
此时最直接的一个办理办法就是干脆不这样做:不要有意将多个句柄指向同一个作用域内的同一个对象.这样做可以使代码更易理解和调试.但是,一旦预备将句柄作为一个自变量或参数传送——这是Java假想的正常办法——别名问题就会自动呈现,因为成立的本地句柄大概改正“外部对象”(在办法作用域之外成立的对象).下面是一个例子:x: 7 y: 7 Incrementing x x: 8 y: 8
输出以下://: Alias2.java // Method calls implicitly alias their // arguments. public class Alias2 { int i; Alias2(int ii) { i = ii; } static void f(Alias2 handle) { handle.i++; } public static void main(String[] args) { Alias2 x = new Alias2(7); System.out.println("x: " + x.i); System.out.println("Calling f(x)"); f(x); System.out.println("x: " + x.i); } } ///:~
x: 7
Calling f(x)
x: 8
办法改变了自己的参数——外部对象.一旦碰到这种情形,必须判断它能否公道,用户能否乐意这样,以及是不是会造成问题.
普通,我们调用一个办法是为了产生返回值,大概用它改变成其调用办法的那个对象的状况(办法其实就是我们向那个对象“发一条消息”的方法).很少需求调用一个办法来处理它的参数;这叫作操纵办法的“副作用”(Side Effect).所以假使成立一个会改正自己参数的办法,必须向用户明确地指出这一情形,并告诫利用那个办法大概会有的后果以及它的潜在威胁.由于存在这些混合和缺陷,所以应当尽大概避免改变参数.
若需在一个办法调用期间改正一个参数,且不打算改正外部参数,就应在自己的办法内部制作一个副本,从而保护那个参数.本章的大大都内容都是环绕这个问题展开的.
以上是“java别名问题[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:制作本地副本
- ·下一篇文章:传送句柄
- ·中查找“java别名问题”更多相关内容
- ·中查找“java别名问题”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论