Строка - почему в обоих случаях возвращаемое значение отличается - PullRequest
1 голос
/ 02 мая 2019

Почему существует вывод diffrenet для буфера String и String

public class ReturnValueFromTryCatchFinally {

    public static void main(String[] args) {
        System.out.println(methodReturningValue());
    }

    static StringBuffer methodReturningValue() {
        StringBuffer buffer = new StringBuffer();
        try {
            buffer.append("aa");
            return buffer;
        }
        catch (Exception e) {
            buffer.append("bbb");
            return buffer;
        }
        finally {
            buffer.append("vvvv");
        }

    }

    static String methodReturningValue1() {
        String buffer = new String();
        try {
            buffer=buffer.concat("aa");
            return buffer;
        }
        catch (Exception e) {
            buffer=buffer.concat("bbb");
            return buffer;
        }
        finally {
            buffer=buffer.concat("vvvv");
        }

    }

}

Для определенного пользователем объекта он также ведет себя как String

Ответы [ 4 ]

0 голосов
/ 02 мая 2019

В случае StringBuffer он неявно знает ссылку на объект, когда значение объекта изменилось в блоке finally, который он понял автоматически. Но в случае строки вы указываете на ссылку, а затем объединяете строку, потому что строка неизменна.

0 голосов
/ 02 мая 2019

return buffer; запоминает экземпляр для возврата.buffer=buffer.concat("vvvv") создать новый экземпляр строки, но она никогда не использовалась.

0 голосов
/ 02 мая 2019

Блок finally вызывается после , значение buffer считывается в return buffer;.Любые изменения самой переменной buffer не возвращаются.

В случае, когда buffer является StringBuffer, вы не изменяете значение buffer, но вместо этого вы изменяете содержимое из buffer, и это может видеть вызывающий метод.

Но в случае, когда buffer является строкой, вы не можете сделать то же самое.Строка неизменна.

0 голосов
/ 02 мая 2019

Когда блок finally выполняет buffer=buffer.concat("vvvv");, он назначает новый String локальной переменной buffer, но метод возвращает исходный экземпляр String, на который ссылалась buffer, когда оператор return buffer;был оценен.

Когда блок finally выполняет buffer.append("vvvv"), он мутирует тот же экземпляр, который возвращается в операторе return buffer, поэтому вы видите мутированный экземпляр, возвращенный методом.

Поведение первого метода эквивалентно:

StringBuffer buffer = new StringBuffer();
buffer.append("aa");
StringBuffer returned = buffer;
buffer.append("vvvv"); // mutates the same instance that will be returned
return returned;

Поведение второго метода эквивалентно:

String buffer = new String();
buffer=buffer.concat("aa");
String returned = buffer;
buffer=buffer.concat("vvvv"); // doesn't affect the returned instance
return returned;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...