给定:Class没有字段,每个变量都是本地的.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
in bigString()
和参数bob
in都littleString()
引用同一个对象,因此如果更改其中一个对象,则更改将立即显示在另一个对象中,因为它们都是对同一对象的引用.
问题是StringBuffer
s是可变的并且具有与它们相关联的内部状态.某些类型的对象(例如String
s)是不可变的,因此您可以安全地将它们作为方法参数传递,并且您知道它们不会被修改.请注意,添加final
关键字对此没有帮助 - 它只是确保bob
永远不会被指定为引用不同的StringBuffer
对象.