lombok的val

2023-02-21

java

满足是发明创造的窒息物——佚名

kt中的val让我用的爱不释手,不用重复定义一个又一个类型,编译器会自动推导

今天遇到一个情况,我们知道把java代码粘贴到kt文件里,idea会自动转换javakt

但反过来将kt代码粘贴到java文件里则不会,原来的val,现在还是val

这时候可以使用lombokvalhttps://projectlombok.org/features/val

image-20230221223643728

例如下面的代码会被编译为合适的类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

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());
}
}
}

会被编译成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

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());
}
}
}

要注意一个细节,对于复合类型,推断的通常是父类,而不是接口,例如

bool ? new HashSet() : new ArrayList()会被推导为AbstractCollection而不是Serializable