正しいオーバーロードのさせかた?(Re: コーディング規約)
トラックバックありがとうございます。ちょっと気になったことがあったので返信をば。
public void print(Date hoge) { System.out.print(new SimpleDateFormat(this.formatStr).format(hoge)); } public void print(Calendar hoge) { this.print(hoge.getTime()); }このように内部で別のオーバーロードメソッドを呼んでいる場合など「どのオーバーロードメソッドが呼ばれても結果が同じ」場合。言い換えると「同じ名前のメソッドなのに挙動が全く異なるようなクラス設計はダメダメ」という事。クラスを分割すべき。
また、この場合public final void print(Calendar hoge) { this.print(hoge.getTime()); }オーバーロードメソッドを呼ぶメソッドをfinalにすると継承しても整合性が壊れにくい。
コーディング規約 - NullPointer's
print(Calendar) を final にしても整合性が壊れてしまう場合があって、具体的にどういう場合かというと「サブクラスの print(Date) が print(Calendar) を呼び出す場合」だったりする。StackOverflowError。
この回避方法は、ちゃんと doc comment に明記をするか、
/** このメソッドは print(Date) を呼び出す。 */ public final void print(Calendar hoge) { this.print(hoge.getTime()); }
あるいは、private メソッドに委譲すべき。
public void print(Date hoge) { internalPrint(hoge); } public void print(Calendar hoge) { internalPrint(hoge.getTime()); } private void internalPrint(Date hoge) { System.out.print(new SimpleDateFormat(this.formatStr).format(hoge)); }
普通は、ここまで神経質にならなくても良いと思うけどね。