val
终于!无麻烦的 final local variables。
val 在 lombok 0.10 引进。
Overview
您可以使用val
作为本地变量声明的类型,而不是实际写入类型。执行此操作时,将从初始化表达式推断出类型。本地变量也将成为final
变量。此功能仅适用于局部变量和foreach
循环,而不适用于字段。初始化表达式是必需的。
val 实际上是一种“类型”,并且作为lombok包中的真实类存在。您必须导入它才能使 val 工作(或用lombok.val
作类型)。在本地变量声明中存在这种类型会触发添加final
关键字以及复制覆盖 'fake' val 类型的初始化表达式的类型。
警告:此功能目前在NetBeans中不起作用。
With Lombok
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());
}
}
}
Vanilla Java
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());
}
}
}
Supported configuration keys:
lombok.val.flagUsage = [warning | error] (default: not set)
如果配置, Lombok 会将任何 val 用法标记为警告或错误。
Small print
对于复合类型,推断出最常见的超类,而不是任何共享接口。例如,bool ? new HashSet() : new ArrayList()
是一个带有复合类型的表达式:结果既是AbstractCollection
,也是Serializable
。推断的类型将是AbstractCollection
,因为它是一个类,而是Serializable
一个接口。
在不明确的情况下,例如当初始化表达式是null
,推断出java.lang.Object
。
网友评论