StaticUtilityクラスへの修飾子
皆さんはStaticUtilityクラスにどんな修飾子をつけていますか?
私はなんの疑問を持たずにfinalをつけていました。
最近のソースコードはfinalをつけずにabstractをつけていたので、その詳細と解説を備忘録として残します。
ちょっと昔の一般的なStaticUtilityの書き方
前のプロジェクトでは、StaticUtilityクラスを作成する際は、final修飾子をつけて
インスタンスを生成されないようにprivateコンストラクタを作成していました。
(毎回、めんどくさいなあと思いながら)
// クラスの修飾子にfinalをつけて継承防ぐ
public final class A {
// インスタンスを生成されないようにprivateコンストラクを作成
private A(){
}
public static String getHello() {
return "Hello";
}
}
最近の書き方
Spring Frameworkのクラスを読んでいるときに発見したのですが、最近の強い人たちは
abstract をつけてStaticUtilityを作成しているようでした。
Springソース
// abstractにしてコンストラクタを書いてない
public abstract class FreeMarkerTemplateUtils {
public static String processTemplateIntoString(Template template, Object model)
throws IOException, TemplateException {
StringWriter result = new StringWriter();
template.process(model, result);
return result.toString();
}
}
理由
抽象クラスの場合、インスタンスの生成ができません。そのため、privateコンストラクタを定義しなくても
インスタンスを生成される心配がないので、コーディング量が減るのだと推察します。
結論
abstaractだと継承されちゃうのでは?と考えたのですが、継承されたところでオーバーライドできないし、
何よりもprivateコンストラクタの手間を考えると圧倒的にabstarctの方がメリットが大きいなと思いました。
(そもそもprivateeコンストラクタ書くの忘れる時があるから、その防止にもなるし!)
どんどん強い人のソースコードを真似していきましょう!