Цикл статей «Project Lombok».
Следующая статья — «Lombok @NonNull, или как я перестал беспокоиться и полюбил NullPointerException».
Предыдущая статья — «».
Добавлено в версии 0.10. Вы можете использовать val в качестве типа при объявлении локальной переменной вместо указания реального типа. При этом тип будет выводиться из выражения инициализации. Локальная переменная будет сделана неизменяемой (final). Эта возможность работает в локальных переменных и для циклов foreach, но не для полей. Обязательно требуется наличие выражения инициализации.
Тип val — это реальный тип, и он находится как реальный класс в пакете lombok. Вы должны импортировать его для работы (или для использования lombok.val в качестве типа). Присутствие этого типа в объявлении локальной переменной добавляет ключевое слово final и копирует тип из выражения инициализации, который переопределяет поддельный тип val.
Эта опция на момент написания этого поста не работает нормально в NetBeans. Разработчики работают над исправлением этого.
С использованием Lombok:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.ArrayList; import java.util.HashMap; import lombok.val; public class ValExample { public String example() { val example = new ArrayList<String>(); example.add("Hello, World!"); val foo = example.get(0); return foo.toLowerCase(); } public void example2() { val map = new HashMap<Integer, String>(); map.put(0, "zero"); map.put(5, "five"); for (val entry : map.entrySet()) { System.out.printf("%d: %s\n", entry.getKey(), entry.getValue()); } } } |
Чистая Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class ValExample { public String example() { final ArrayList<String> example = new ArrayList<String>(); example.add("Hello, World!"); final String foo = example.get(0); return foo.toLowerCase(); } public void example2() { final HashMap<Integer, String> map = new HashMap<Integer, String>(); map.put(0, "zero"); map.put(5, "five"); for (final Map.Entry<Integer, String> entry : map.entrySet()) { System.out.printf("%d: %s\n", entry.getKey(), entry.getValue()); } } } |
Поддерживаемые ключи конфигурации
1 2 |
lombok.val.flagUsage = [warning | error] (default: not set) Lombok will flag any usage of val as a warning or error if configured. |
Мелкий шрифт
Для составных типов наиболее общий класс выводится, но не интерфейс. Например, bool ? new HashSet() : new ArrayList() — это выражение со составным типом, то есть результат одновременно AbstractCollection и Serializable. Здесь выведется тип AbstractCollection, так как он является классом, а Serializable — интерфейс.
В неоднозначных случаях, например когда выражение инициализации равно null, выводится тип java.lang.Object.
Цикл статей «Project Lombok».
Следующая статья — «Lombok @NonNull, или как я перестал беспокоиться и полюбил NullPointerException».
Предыдущая статья — «».
не увидел в скомпилированных классах final, просто на тип заменяет.
похоже что ничем от стандартного var не отличается.