日付時刻を使いやすくするためにはDateで全部できなきゃだめだよね

いろいろ考えると、結局、そういう結論になりました。
ようするに、Dateクラスのメソッドのdeplicatedが全部はずせればいいんです。
で、国際化のために、コンストラクタを使わずgetInstanceとかstaticメソッド用意する。

static Date getInstance();
static Date getInstance(TimeZone zone);
static Date getInstance(Locale aLocale);
static Date getInstance(TimeZone zone, Locale aLocale);
//以下、TimeZone付きは省略

static Date getInstance(Date d);
static Date getInstance(long date);
static Date getInstance(String s);
static Date getInstance(String s, String format);
static Date getInstance(int year, int month, int date);
static Date getInstance(int year, int month, int date, int hrs, int min);
static Date getInstance(int year, int month, int date, int hrs, int min, int sec);


で、実際に取得する日付時刻はCalendar機能をもったもの

class CalendarDate extends Date{
  Calendar calendar;
  CalendarDate(Calendar calendar){
      super();
      this.calendar = calendar;
  }
  CalendarDate(Calendar calendar, long time){
      super(time);
      this.calendar = calendar;
  }

  int getMonth(){
    calendar.set(this);
    return calendar.get(Calendar.MONTH);
  }


なので、Date.getInstance()はCalendarDateのインスタンスを返す。
あとは、Date自体にも、こんな感じのメソッドを追加するとなおいい

  class Date{
    String toDateString();
    String toTimeString();
    String toFormatString(String format);
  }


難点は、そこらへんの野良Dateでの扱いがまぎらわしくなるところとCalendarの参照分オブジェクトサイズが大きくなること。
こんな感じの、Dateを返すメソッドがあったとき、そのまま使うのは、いくない。

Date d = hoge.getDate();
d.getMonth();


こうするのがオススメ。

Date d = Date.getInstance(hoge.getDate());
d.getMonth();


Dateの挙動が切り換えれないというのが問題だったんなら、あんまりたいした問題じゃないと思うけど。
とにかく、わかりやすくするためには、DateクラスのJavaDocさえみれば全部わかるというのが必要。
そういう意味で、getInstanceの定義を

CalendarDate getInstance();

とするより、Dateを返すことにしておいたほうがいい。