val

Overview

NEW in Lombok 0.10: You can use val as the type of a local variable declaration instead of actually writing the type. When you do this, the type will be inferred from the initializer expression. The local variable will also be made final. This feature works on local variables and on foreach loops only, not on fields. The initializer expression is required.

val is actually a 'type' of sorts, and exists as a real class in the lombok package. You must import it for val to work (or use lombok.val as the type). The existence of this type on a local variable declaration triggers both the adding of the final keyword as well as copying the type of the initializing expression which overwrites the 'fake' val type.

WARNING: This feature does not currently work in NetBeans. We're working on fixing that.

With Lombok

01 import java.util.ArrayList;
02 import java.util.HashMap;
03 import lombok.val;
04 
05 public class ValExample {
06   public String example() {
07     val example = new ArrayList<String>();
08     example.add("Hello, World!");
09     val foo = example.get(0);
10     return foo.toLowerCase();
11   }
12   
13   public void example2() {
14     val map = new HashMap<Integer, String>();
15     map.put(0"zero");
16     map.put(5"five");
17     for (val entry : map.entrySet()) {
18       System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
19     }
20   }
21 }

Vanilla Java

01 import java.util.ArrayList;
02 import java.util.HashMap;
03 import java.util.Map;
04 
05 public class ValExample {
06   public String example() {
07     final ArrayList<String> example = new ArrayList<String>();
08     example.add("Hello, World!");
09     final String foo = example.get(0);
10     return foo.toLowerCase();
11   }
12   
13   public void example2() {
14     final HashMap<Integer, String> map = new HashMap<Integer, String>();
15     map.put(0"zero");
16     map.put(5"five");
17     for (final Map.Entry<Integer, String> entry : map.entrySet()) {
18       System.out.printf("%d: %s\n", entry.getKey(), entry.getValue());
19     }
20   }
21 }

Supported configuration keys:

lombok.val.flagUsage = [warning | error] (default: not set)
Lombok will flag any usage of val as a warning or error if configured.

Small print

For compound types, the most common superclass is inferred, not any shared interfaces. For example, bool ? new HashSet() : new ArrayList() is an expression with a compound type: The result is both AbstractCollection as well as Serializable. The type inferred will be AbstractCollection, as that is a class, whereas Serializable is an interface.

In ambiguous cases, such as when the initializer expression is null, java.lang.Object is inferred.