Skip to content

Instantly share code, notes, and snippets.

@sttk
Last active March 20, 2024 13:56
Show Gist options
  • Save sttk/4bdf234a8dbbacfd9e2ba0372cedf2f3 to your computer and use it in GitHub Desktop.
Save sttk/4bdf234a8dbbacfd9e2ba0372cedf2f3 to your computer and use it in GitHub Desktop.
Java named parameters

Java named parameters

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}
$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment