假设:类有没有字段,每一个变量是局部的。 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()指的是同一个对象,因此,如果您更改这些对象中的一个,更改将立即在其他的出现,因为它们是同一个对象都引用

在的问题是,StringBuffers是可变的,并具有与它们相关联的内部状态。有些类型的对象(如Strings)是不可改变的,所以你可以放心地通过他们周围作为方法参数,你知道,他们永远不会得到改变。需要注意的是添加final关键字不会在这里帮助 - 它只是确保在bob永远不会被分配给指不同StringBuffer对象

其他提示

这不是递东西回来。它修改的StringBuffer你传递给一个参考。在Java对象不值传递。

如果你的意思是,为什么字符串缓冲区得到改进,这是因为你是传递一个参考字符串缓冲区,它允许你调用哪个修改字符串缓冲区对象的公共方法Append。

上面差不多的答案了吧,除了已经提到一个小东西处理不当:Java语言缺少“常量性”,这意味着你希望对象是不可修改的。

“最终”接近,但它仍然犯规做好这方面的工作。什么代码片段显示是错误的类型,如果你有作为参数传递给其他方法可变对象,可以发生。这可以通过具有不变的对象是固定的,或者如果有添加了深常量性某种新的关键字的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top