Есть следующий код на С:
char *s1 = NULL;
char *s2 = "asd";
char *s3 = "new";
s1 == NULL ? (s1 = s3) : (s2 = s3);
Смысл — записываем значение s3 в нулевой указатель либо в s2.
Пишем такой же код на Java:
Integer a = null;
Integer b = 7;
Integer c = 10;
a == null ? (a = c) : (b = c);
Говорит, что not a statement. Ей обязательно нужно, чтобы слева от выражения стояла переменная. Как можно сделать то, что я написал иначе, или я что-то недопонимаю глобально?
Изначально я хотел что-то вроде:
(a == null ? a : b) = c
но так даже С не захотел :)
Да понятно что if-ами можно, но мне такое вполне нормально читается, а главное — компактно. И мне уже больше интересно, почему у Джавы такое поведение?
Имхо как раз конструкция `(condition ? lvalue : lvalue) = rvalue' вполне читаема, а вот идея использовать `condition ? assignment : assignment' - как правило идея сомнительная.
Минусы в ней такие:
1. лишнее ограничение на одинаковость типа в обоих присваиваниях;
2. именно для этого есть стандартная конструкция if/then/else, и именно она на человеческом языке соответствует тому, что ты делаешь;
3. когда поставишь == вместо =, человек этого не заметит (из-за необычности), да и за компилятор я тоже не уверен;
4. конструкция слишком сложна при своей экзотичности (4 аргумента в одних только присваиваниях!), плохо читаема, и потому слишком легко ошибиться при написании и допускает неправильное прочтение (как уже произошло с анонимусом). Перечитай это предложение ещё раз - оно проще, чем твоя конструкция :)
Резюме:
либо пиши (s1 ? s2 : s3) = rvalue (только C),
либо используй if/then/else.
В общем понятно, спасибо за ваши комментарии. На счёт читаемости, всё же, не совсем согласен. Это непривычно, да, как и само использование оператора "?" (по крайней мере мне так вначале было), а сейчас читается нормально. Но городить костыли в Джаве не хочется, поэтому буду с ифами писать.
+1. Змеюко волосатая одноглазая умеет самый полезный из операторов, тренарный, только путём какой-то замысловатой комбинации отступов без применения других символов, а поясняющая его глава в документации написана пробелами.
Да, на жаве это будет весьма неуклюже выглядеть. Жаль, что её создатели никогда не предполагали её практического использования. Иначе наверное постарались бы сделать её менее запутанной и более очевидной.
>Да, на жаве это будет весьма неуклюже выглядеть. Жаль, что её создатели никогда не предполагали её практического использования. Иначе наверное постарались бы сделать её менее запутанной и более очевидной.
Джавафобы набежали. Обычно такие плюются от джавы, но почему-то юзают дотнет.
Не передёргивай, товарищ. Независимо от наличия жабафобов/филов, жаба по ТТХ ушла весьма недалеко от gwbasic, да и этот лишек использовать почему-то стрёмаются. Наивные видимо думают, что если для описания каждого незамысловатого действия настрочить семитомник о восьми томах, желательно произведя иерархию (недо)классов поразвесистее, то читаемость кода немилосердно повысится, глякавость и тормознутость понизится, и настанет вселенское счастие.