Предоставляет ли Java 10 ключевое слово val? Если нет, то почему нет?
Java 10 приносит C#-подобный var
Ключевое слово для локального вывода типа.
Но Java 10 также обеспечивает val
ключевое слово, как найти в Scala?
val
будет работать как var
но привязка будет final
,
var x = "Hello, world. ";
x = "abc"; // allowed
val y = "Hello, world. ";
y = "abc"; // forbidden
Если это не так, есть ли причина, что это так?
2 ответа
Здесь нет val
в Java 10, как указано в JEP 286: Вывод типа локальной переменной:
Выбор синтаксиса
Было много мнений о синтаксисе. Здесь есть две основные степени свободы: какие ключевые слова использовать (var, auto и т. Д.) И нужно ли иметь отдельную новую форму для неизменяемых локальных объектов (val, let). Мы рассмотрели следующие синтаксические варианты:
- только var x = expr (например, C#)
- VAR плюс VAL для неизменных местных жителей (таких как Scala, Kotlin)
- VAR, плюс пусть для неизменных местных жителей (например, Swift)
- auto x = expr (например, C++)
- const x = expr (уже зарезервированное слово)
- окончательный x = expr (уже зарезервированное слово)
- пусть x = expr
- def x = expr (как Groovy)
- x: = expr (как Go)
После сбора существенного вклада, var был явно предпочтен Groovy, C++ или Go. Существовало значительное разнообразие мнений по поводу второй синтаксической формы для неизменных местных жителей (val, let); это будет компромиссом дополнительной церемонии для дополнительного захвата замысла проекта. В итоге мы решили поддерживать только вар. Некоторые подробности об обосновании можно найти здесь.
И вот основные рассуждения:
Я знаю, что это та часть, которая действительно волнует людей:). После подробного изучения плюсов и минусов, кажется, есть очевидный победитель - только для var. Причины этого включают в себя:
Хотя это был не самый популярный выбор в опросе, это был тот выбор, с которым большинство людей согласились. Многие ненавидели вар / вал; другие ненавидели вар / лет. Почти никто не ненавидел только вар.
Опыт работы с C#, который имеет только var, показал, что это разумное решение в Java-подобных языках. Нет достаточного спроса на "val" в C#.
Желание уменьшить церемонию неизменности, безусловно, хорошо воспринято, но в этом случае толкает не тот конец рычага. Где нам нужна помощь для неизменности, это с полями, а не с местными жителями. Но var/val не относится к полям, и почти наверняка никогда не будет.
Если бы дополнительные издержки получения контроля изменчивости над выводом типа были равны нулю, мог бы быть более сильный случай, но было ясно, что многие люди находят два разных ведущих ключевых слова отвлекающими, которые не давали глазам быстро сосредоточиться на важных вещах., Если имена переменных важнее типов, они также важнее модификаторов изменчивости.
( Источник)
Потому что final var
для этого в Java. Если бы мы имели val
тоже было бы две вещи, которые означают одно и то же. Это не хорошо. Должен быть только один способ выразить определенную вещь.
Если вы хотите использовать "val", то есть "final var", вы всегда можете использовать val Lombok.