Skip to content
YellowStar5 edited this page Aug 5, 2019 · 4 revisions

val

终于! 无忧无虑的 final 局部变量。

val是在lombok 0.10中引入的。

概览

你可以使用 val 作为局部变量声明的类型,而不是写实际的类型。 执行此操作时,将从初始化表达式推断出类型。 局部变量也将成为 final。 此功能仅适用于局部变量和foreach循环,而不适用于字段。 初始化表达式是必需的。

val实际上是一种“类型”,在lombok包中作为一个真正的类存在。 你必须导入它才能使val工作(或使用lombok.val作为类型)。 在本地变量声明中存在这种类型 (val) 会触发添加final关键字以及复制初始化表达式的类型(该类型会覆盖'伪'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());
    }
  }
}

支持的配置键

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

下面是补充内容

如何使用配置键

在package下建立lombok.config文件,比如val package。 此时配置值为 lombok.val.flagUsage = warning, 在编译时看到下图的警告

lombok-flag-warnin

此时假如我们把值改为 lombok.val.flagUsage = error, (注意用IDEA等工具时,要删除target下面编译好的类,此配置才生效), 在编译时会报下图中的错误

lombok-flag-erro