単純な言語では、抽象クラスと最終クラスの概念を定義します。
抽象クラスはインスタンス化できませんが、サブクラスを持つことができます。
最終クラスは、継承を禁止されているクラスです。
より正確な定義については、公式チュートリアルを参照してください。
クラスの抽象と最終の組み合わせは、クラスが子孫を持つことができず、このクラスのインスタンスを作成できないことを意味します。
たとえば、静的メソッドで構成されるユーティリティのクラス(java.lang.Mathやjava.util.Arraysなど)を作成する場合、抽象クラスと最終クラスを同時に作成する必要があります。
解決策
public class UtilityClass {
private UtilityClass() {
throw new AssertionError();
}
... //
}
* This source code was highlighted with Source Code Highlighter .
ご存じのように、デフォルトのコンストラクターは、クラスに明示的なコンストラクターが含まれていない場合にのみ作成されます。 したがって、クラスにパラメーターを指定せずにプライベートコンストラクターを定義することにより、クラス外のコードからインスタンス化できないようにします。 AssertionErrorは厳密には必須ではありませんが、コンストラクターがクラスから誤って呼び出された場合に備えて保険を提供します。 これにより、どのような状況でもクラスがインスタンス化されなくなります(抽象)。 このイディオムは、このクラスからのサブクラス化も防ぎます(最終)。 すべてのコンストラクターは、スーパークラスのコンストラクターを明示的または暗黙的に呼び出す必要があり、このクラスのサブクラスは基本クラスのコンストラクターにアクセスできません。