StringBuffer如何通过类中没有字段的空格传递数据?

时间:2009-02-12 02:26:07

标签: java stringbuffer

给定: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,但它是。什么样的黑魔法在这里?这打破了我所知道的所有封装规则。我很震惊,言语让我失望。

4 个答案:

答案 0 :(得分:7)

littleString没有传回对象 - 它只是使用相同的对象。 bob中的局部变量bigString()bob中的参数littleString()都指向同一个对象,因此如果您更改其中一个对象,则更改将立即显示在另一个因为它们都是对同一个对象的引用

问题是StringBuffer是可变的,并且内部状态与它们相关联。某些类型的对象(例如String s)是不可变的,因此您可以安全地将它们作为方法参数传递,并且您知道它们永远不会被修改。请注意,添加final关键字在此处没有帮助 - 它只是确保永远不会分配bob来引用不同的StringBuffer对象。

答案 1 :(得分:1)

它没有传回任何东西。它正在修改您传递引用的StringBuffer。 Java中的对象不是按值传递的。

答案 2 :(得分:1)

如果你的意思是为什么字符串缓冲区被修改,那是因为你传递了一个字符串缓冲区的引用,它允许你调用修改字符串缓冲区对象的公共方法append。

答案 3 :(得分:0)

上面的答案几乎得到了它,除了一件小事没有提到:java缺乏“const-ness”,这意味着你想要一个对象是不可修改的。

“final”很接近,但它仍然无法正常完成工作。代码片段显示的是如果您将可变对象作为参数传递给其他方法时可能发生的错误。这可以通过使用不可变对象或者为深度常量添加某种新关键字来修复。