範囲を扱うクラス

昨日、日付の範囲(form-to)を扱うコードを追ってて、GenericsなRangeを思いついた。
今のところ(いまだに)Java SE 1.4なんだけど、そのうちJava SE 6向けに全面書き換えしたいと思っている。
で、Rangeを書いていて、「もしかして…」とググったら英語なページをいくつか発見したので、メモ。
Declarative programming: a Range type for Java | brain driven development
http://weblogs.java.net/blog/mkarg/archive/2011/01/01/generic-range-class

多少アレンジしたのが以下。(getterは略)

public class Range<T extends Comparable<T>>{

    private final T _from;
    private final T _to;

    public Range(final T from, final T to){
        _from = from;
        _to = to;
    }

    public T getFrom() { return _from; }
    public T getTo() { return _to; }

    public boolean contains(final T value) {
        if (null == value) return false;
        return
            from.compareTo( value ) <= 0 &&
            value.compareTo(to) <= 0;
    }
}

この実装だと、いわゆる「両端*1」。
「片端*2」をどうするかとか考えている。
数学の教科書では●*3と○*4で書かれていたかな。

F   T
●ーーー● // f<=v<=t
○ーーー● // f <v<=t
●ーーー○ // f<=v< t
○ーーー○ // f< v< t
  1. containsのバリエーション的なメソッドを用意する
  2. 両端と片端をcontainsの引数に渡す
    1. boolean でフラグ
    2. enumを用意する
  3. 両端と片端を扱うクラスを別クラス(親子関係?)にする

どれもいまいち感が…

*1:from <= x && x <= to

*2:from < x && x <= to や from <= x && x < to

*3:くろまる;塗りつぶし

*4:しろまる;輪郭のみ