Как StringBuffer передает данные через пустоты без полей в классе? - PullRequest
1 голос
/ 12 февраля 2009

Дано: у класса нет полей, каждая переменная является локальной. littleString был создан путем рефакторинга bigString в Eclipse:

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 ]

7 голосов
/ 12 февраля 2009

littleString не передает объект обратно - он просто использует тот же объект. И локальная переменная bob в bigString(), и параметр bob в littleString() относятся к одному и тому же объекту, поэтому, если вы измените один из этих объектов, изменения мгновенно появятся в другом , потому что они ' обе ссылки на один и тот же объект .

Проблема в том, что StringBuffer являются изменяемыми и имеют внутреннее состояние, связанное с ними. Некоторые типы объектов (например, String s) являются неизменяемыми, поэтому вы можете безопасно передавать их как параметры метода, и вы знаете, что они никогда не будут изменены. Обратите внимание, что добавление ключевого слова final здесь не помогает - оно просто гарантирует, что bob никогда не будет назначено обращение к другому объекту StringBuffer.

1 голос
/ 12 февраля 2009

Если вы имели в виду, почему строковый буфер изменяется, то это потому, что вы передавали ссылку на строковый буфер, который позволяет вам вызывать открытый метод append, который изменяет объект строкового буфера.

1 голос
/ 12 февраля 2009

Это ничего не передает назад. Это модифицирует StringBuffer, на который вы передали ссылку. Объекты в Java не передаются по значению.

0 голосов
/ 12 февраля 2009

ответы, приведенные выше, в значительной степени получили его, за исключением одной мелочи, которая не была упомянута: в java отсутствует «постоянство», что означает, что вы хотите, чтобы объект был неизменяем.

"final" близок, но все равно не выполняет работу должным образом. Фрагмент кода демонстрирует вид ошибки, которая может произойти, если у вас есть изменяемые объекты, переданные в качестве параметров другим методам. Это может быть исправлено либо наличием неизменяемых объектов, либо добавлением какого-либо нового ключевого слова для большей константности.

...