Неизменяемые струны с троичным оператором - PullRequest
0 голосов
/ 09 октября 2018

Я работал над проектом и написал этот фрагмент кода
dna = Math.random() > PERCENT ? dna + LETTERA : dna + LETTERB;, и я точно не знаю, почему он работает.

dna - это String
LETTERA и LETTERB являются char

Сам код работает так, как я хочу, проблема в том, что я не понимаю, почему.Я думал, что строки в Java являются неизменяемыми, поэтому, когда я говорю dna + LETTERA, я должен получить сообщение об ошибке, но я не получаю.

Сначала, когда я писал код, я не использовал dna + LETTERB Я использовал dna += LETTERB, но я получаю следующую ошибку, Syntax error on token "+=", + expected

Если вы напишите что-то вроде:
String testStr = "test";
testStr + "example";
вы получаете сообщение об ошибке InvalidAssignmentOperator, может, кто-нибудь объяснит мне, почему вы можете добавить строку в тройной оператор, как этот?

1 Ответ

0 голосов
/ 09 октября 2018

string + something создает новый String, поэтому исходный String не изменяется (он должен быть неизменным), и новый неизменный String создается с включенным новым персонажемконец этого.

Так вот почему троичный оператор работает нормально.Он создаст один или другой новый String по обе стороны от : (в зависимости от условия до ?) и вернет вам тот, который он создал.


Ошибкас кодом, который вы дали мне по-другому, поэтому я не уверен:

error: not a statement
        testStr + "example";
                ^

Я думаю, вы могли иметь в виду это:

String testStr = "test";
testStr += "example";

Это компилируется.Причина в том, что объект "test" является неизменным, но не является переменной testStr.Если переменная не помечена final вами, вы можете сделать так, чтобы переменная позже ссылалась на другой объект.

Это немного похоже на стирание адреса из конверта и запись другого адреса.Вы ничего не изменили в доме по этому адресу (вы не мутировали в доме).Вы только что изменили дом, на который ссылаетесь (вы только что мутировали конверт, который относится к дому).

Сначала testStr относится к "test".Позже это относится к "testexample".Старый неизменный "test" все еще там, пока не будет собран мусор.Это не изменилось.Был создан совершенно новый String, и теперь переменная, которая не является неизменной, ссылается на новую неизменяемую String.

...