Javaプログラミング言語の抽象クラスと最終クラスは同時に!?

この記事は、 Joshua BlochによるEffective Java第2版の章に対する著者の理解を示しています。



単純な言語では、抽象クラスと最終クラスの概念を定義します。

抽象クラスはインスタンス化できませんが、サブクラスを持つことができます。

最終クラスは、継承を禁止されているクラスです。



より正確な定義については、公式チュートリアルを参照してください。



クラスの抽象と最終の組み合わせは、クラスが子孫を持つことができず、このクラスのインスタンスを作成できないことを意味します。



たとえば、静的メソッドで構成されるユーティリティのクラス(java.lang.Mathやjava.util.Arraysなど)を作成する場合、抽象クラスと最終クラスを同時に作成する必要があります。





解決策





public class UtilityClass {



private UtilityClass() {

throw new AssertionError();

}



... //

}




* This source code was highlighted with Source Code Highlighter .








ご存じのように、デフォルトのコンストラクターは、クラスに明示的なコンストラクターが含まれていない場合にのみ作成されます。 したがって、クラスにパラメーターを指定せずにプライベートコンストラクターを定義することにより、クラス外のコードからインスタンス化できないようにします。 AssertionErrorは厳密には必須ではありませんが、コンストラクターがクラスから誤って呼び出された場合に備えて保険を提供します。 これにより、どのような状況でもクラスがインスタンス化されなくなります(抽象)。 このイディオムは、このクラスからのサブクラス化も防ぎます(最終)。 すべてのコンストラクターは、スーパークラスのコンストラクターを明示的または暗黙的に呼び出す必要があり、このクラスのサブクラスは基本クラスのコンストラクターにアクセスできません。



All Articles