なんらかのクラスのインスタンスを得るのに、newするのが望ましくない場合があります。
大勢で開発していると、newしないようにすることを徹底させるのは困難です。
ただのクラスの場合、privateなデフォルトコンストラクタを設けることでnewを阻止できます。
↓例えばこんな風にして。
public class Test { private Test() { } }
しかし、このクラスの派生クラスを作りたい、その派生クラスをnewさせないようにしたい、
っていう要求はなかなか難しい。
もちろん、その派生クラスにprivateデフォルトコンストラクタをしかければよろしいが、
派生クラスをコーディングする人がそれを仕掛け忘れるかもしれない。
基底クラスにprivateデフォルトコンストラクタを作ると、派生クラスが作れなくなってしまいます。
さりとて、じゃあprotectedにすればいいかというとさにあらず。それだとnewできてしまいますね。
もちろん無印にしても無駄。
そこで考えました。基底クラスに細工をして、派生クラスをnewさせない方法。
public class Test001 extends TestBase { }
public class TestBase { public TestBase() { throw new RuntimeException("このクラスおよび派生クラスのインスタンス化は禁止されています"); } }
これで、Test001をnewすると、newするようなコードは書けるものの、
実行時にnewする時点で例外が発生します。
newを阻止するには十分かと。
しかし、できればコンパイルレベルで阻止したいなぁ。
Eclipseで赤線引かれるようにできないもんかな。
・・・あれ?でもこのクラス、どうやってインスタンスを得るんだろう?w