SICP : Ex1.04 : Java

[id:lethevert:20051219:p1]
手続きを条件で切り替えるという問題

public class Main {
  public static void main(String[] args) {
    System.out.println(plus_abs(2,3));
    System.out.println(plus_abs(2,-3));
  }
  public static int plus_abs(int x, int y) {
    abstract class Oper { abstract int f(int x, int y); }

    Oper op = y > 0 ?
      new Oper() {int f(int x, int y) { return x+y;}} :
      new Oper() {int f(int x, int y) { return x-y;}} ;

    return op.f(x,y);
  }
}

手続きの内容がシンプルだと、このように形式的な部分の記述が長くなってしまうのだけれど、手続きが複雑になれば、有用なテクニックになります。オブジェクト指向用語で、「多態性」とか「多相性」とかと呼ばれることが多いテクニックですね。