いろいろ考えると、結局、そういう結論になりました。
ようするに、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を返すことにしておいたほうがいい。