Java でやる名前付き引数

こういうことになろうかと。

public class N {
  class Param {
    String A;
    String B;
    String C;
    // ...
    public String build() {
      // ...
      return null;
    }
  }
  public void put(Param p, int from, int to) {
    String s = p.build();  // パラメータを組み立てる。入力チェックとかもすればいい。
    // ...
  }
  

}

呼び出す方は以下のような感じ。

  public void test() {
    new N().put(new N.Param() {{
      A = "PC";
      B = "M";
      C = "P";
      // ...
    }}, 23, 5);
  }

Map を使って似たようなことが当然出来るが、違いはパラメータ名の間違えた時に、コンパイルエラーが出るかどうか。


んー。結局それらしいことが出来ることは出来るけど、new N.Param() とか "{{" とか、煩わしい。
言語特性と合ってないんだな。やりたいことが。Map 使う方がいっかあ・・・?

  public void put(Map m, int from, int to) {
    
  }

というメソッドに対して、以下のように埋めるとそれっぽくなる。(Generics は省略)

  @SuppressWarnings({ "serial"})
  public void test() {
    new N().put(new HashMap() {{
      put('A', "PC");
      put('B', "M");
      put('C', "P");
    }}, 23,5);
  }

SuppressWarnings が煩わしい。put 連発やなかんじ。


・・・あまりやってるのを見ない理由もわかるなあ。


名前付きを諦めて、固定引数でやった場合と配列でやった場合はそれぞれ以下のようになる。

    put(
      "PC",
      "M",
      "P",
      24, 0);

    put(new String[] {
        "PC",
        "M",
        "P",
    }, 24, 0);