By using Consumer
like functional interface.
The sample code is as follows:
package mypackage;
import static mypackage.MyData.NamedParam.*;
public class Main {
public static void main(String[] args) {
var data = new MyData(field4("abc"), field2(123));
System.out.println(data);
}
}
package mypackage;
public class MyData {
private final String field1;
private final int field2;
private final boolean field3;
private final String field4;
public MyData(NamedParam ...params) {
var init = new Init();
for (var param : params) {
param.setTo(init);
}
this.field1 = init.field1;
this.field2 = init.field2;
this.field3 = init.field3;
this.field4 = init.field4;
}
public String toString() {
return new StringBuilder("MyClass {")
.append("field1=" + field1)
.append(", field2=" + field2)
.append(", field3=" + field3)
.append(", field4=" + field4)
.append("}")
.toString();
}
@FunctionalInterface
public interface NamedParam {
void setTo(Init init);
static NamedParam field1(String v) { return o -> o.field1 = v; }
static NamedParam field2(int v) { return o -> o.field2 = v; }
static NamedParam field3(boolean v) { return o -> o.field3 = v; }
static NamedParam field4(String v) { return o -> o.field4 = v; }
}
private class Init {
private String field1;
private int field2;
private boolean field3;
private String field4;
}
}
The result is as follows:
$ javac mypackage/*.java
$ java -cp . mypackage.Main
MyClass {field1=null, field2=123, field3=false, field4=abc}
$