Как StringBuffer передает данные через пустоты без полей в классе?
-
22-08-2019 - |
Вопрос
Данный:Класс не имеет полей, каждая переменная локальная.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 обратно, но это так.Что за черная магия здесь творится?Это нарушает все известные мне правила инкапсуляции.Я в шоке, слов не хватает.
Решение
littleString
не передает объект обратно — он просто использует тот же объект.Обе локальные переменные bob
в bigString()
и параметр bob
в littleString()
относятся к одному и тому же объекту, поэтому, если вы измените один из этих объектов, изменения мгновенно отобразятся в другом. потому что они обе ссылки на один и тот же объект.
Проблема в том, что StringBuffer
s являются изменяемыми и имеют связанное с ними внутреннее состояние.Некоторые типы объектов (например, String
s) являются неизменяемыми, поэтому вы можете безопасно передавать их как параметры метода, и вы знаете, что они никогда не будут изменены.Обратите внимание, что добавление final
Ключевое слово здесь не поможет – оно просто гарантирует, что bob
никогда не назначается для ссылки на другой StringBuffer
объект.
Другие советы
Он ничего не передает обратно.Он изменяет StringBuffer, на который вы передали ссылку.Объекты в Java не передаются по значению.
Если вы имели в виду, почему изменяется строковый буфер, то это потому, что вы передавали ссылку на строковый буфер, которая позволяет вам вызвать общедоступный метод, который изменяет объект строкового буфера.
ответы выше в значительной степени поняли, за исключением одной мелочи:В Java отсутствует «константность», то есть вы хотите, чтобы объект был неизменяемым.
«Финал» близок, но он все еще не справляется со своей задачей должным образом.То, что показал фрагмент кода, — это тип ошибки, которая может произойти, если у вас есть изменяемые объекты, передаваемые в качестве параметров другим методам.Это можно исправить, либо добавив неизменяемые объекты, либо добавив какое-то новое ключевое слово для глубокой константности.