Как StringBuffer передает данные через пустоты без полей в классе?

StackOverflow https://stackoverflow.com/questions/539758

  •  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() относятся к одному и тому же объекту, поэтому, если вы измените один из этих объектов, изменения мгновенно отобразятся в другом. потому что они обе ссылки на один и тот же объект.

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

Другие советы

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

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

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

«Финал» близок, но он все еще не справляется со своей задачей должным образом.То, что показал фрагмент кода, — это тип ошибки, которая может произойти, если у вас есть изменяемые объекты, передаваемые в качестве параметров другим методам.Это можно исправить, либо добавив неизменяемые объекты, либо добавив какое-то новое ключевое слово для глубокой константности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top