流れるようなインターフェイス+ジェネリクス

ただ、静的な言語の場合はクラスを継承してメソッドを追加する場合に問題がある。
それは、while() や orderBy() や limit() の戻り値の型が Query のままなので、これらのメソッドの戻り値に対して追加したメソッドがそのままでは呼び出せないということだ。

キーワード引数のかわりに fluent interface (流れるようなインターフェース) を使う - kなんとかの日記


出来るよ!

class Rows {}

interface Query<E extends Query<E>> {
    E findAll(String str);
    E where(String pred);
    E orderBy(String col);
    E limit(int n);
    
    Rows execute();
}

class MyQuery<E extends MyQuery<E>> implements Query<MyQuery<E>> {
    public MyQuery<E> findAll(String str) { return this; }
    public MyQuery<E> where(String pred) { return this; }
    public MyQuery<E> orderBy(String col) { return this; }
    public MyQuery<E> limit(int n) { return this; }
    
    public Rows execute() { return new Rows(); }
    
    public MyQuery<E> whereBetween(String col, int from, int to) { return this; }
}

public class Main {
    public static void main(String[] args) {
        MyQuery q = new MyQuery().findAll("stocks")
                                 .where("price >= 1000")
                                   .whereBetween("price", 10000, 20000)
                                 .orderBy("name")
                                   .limit(10);
        Rows rows = q.execute();
    }
}


久しぶりにJava書いたら、なんどもstringとか打ってしまったよ。