一个StringBuffer是如何传递的数据通过空隙与类没有字段?
-
22-08-2019 - |
题
假设:类有没有字段,每一个变量是局部的。 littleString通过在Eclipse重构bigString创建的:
public String bigString()
{
StringBuffer bob = new StringBuffer();
this.littleString(bob);
return bob.toString();
}
private void littleString(final StringBuffer bob)
{
bob.append("Hello, I'm Bob");
}
的方法littleString不应传递的StringBuffer回来,但却又是是。什么样的黑魔法的那张吗?这破坏了封装的所有规则,我知道。我很震惊,我无法用言语。
解决方案
littleString
不传递对象背部 - 它只是使用相同的对象。无论是在bob
局部变量bigString()
和bob
参数littleString()
指的是同一个对象,因此,如果您更改这些对象中的一个,更改将立即在其他的出现,因为它们是同一个对象都引用的
在的问题是,StringBuffer
s是可变的,并具有与它们相关联的内部状态。有些类型的对象(如String
s)是不可改变的,所以你可以放心地通过他们周围作为方法参数,你知道,他们永远不会得到改变。需要注意的是添加final
关键字不会在这里帮助 - 它只是确保在bob
永远不会被分配给指不同StringBuffer
对象
其他提示
这不是递东西回来。它修改的StringBuffer你传递给一个参考。在Java对象不值传递。
如果你的意思是,为什么字符串缓冲区得到改进,这是因为你是传递一个参考字符串缓冲区,它允许你调用哪个修改字符串缓冲区对象的公共方法Append。
上面差不多的答案了吧,除了已经提到一个小东西处理不当:Java语言缺少“常量性”,这意味着你希望对象是不可修改的。
“最终”接近,但它仍然犯规做好这方面的工作。什么代码片段显示是错误的类型,如果你有作为参数传递给其他方法可变对象,可以发生。这可以通过具有不变的对象是固定的,或者如果有添加了深常量性某种新的关键字的。
不隶属于 StackOverflow