When you compile DefExample.java with this fork of lombok in the classpath, it will automatically inject the correct two methods seen below into the same class file.
javac -cp lombok.jar:guava.jar DefExample.java
private static void foo(int a, int b) {
foo(a, b, 99, "default", true, 99.9, Optional.empty());
}
private static void foo(int a, int b, final java.util.Map<String, Object> paramsMap) {
foo(a,
b,
paramsMap.containsKey("c") ? (int)paramsMap.get("c") : 99,
paramsMap.containsKey("d") ? (String)paramsMap.get("d") : "default",
paramsMap.containsKey("e") ? (boolean)paramsMap.get("e") : true,
paramsMap.containsKey("f") ? (double)paramsMap.get("f") : 99.9,
paramsMap.containsKey("g") ? (Optional<String>)paramsMap.get("g") : Optional.empty());
}
Now you can run DefExample:
java -cp <path to DefExample.class>:guava.jar DefExample
All defaults:
a: 1
b: 2
c: 99
d: default
e: true
f: 99.9
g: was not passed
Overriding a couple defaults:
a: 1
b: 2
c: 99
d: not default!
e: false
f: 99.9
g: was not passed
Passing all parameters:
a: 1
b: 2
c: 3
d: 4
e: false
f: 5.0
g: not default!
@Def can be used on all primitives (except for char), as well as Strings and Java 8 Optionals. If using Optionals, no default value needs to be provided, as Optional.empty() will automatically be used.