제이온

[Effective Java] アイテム4 インスタンス化を阻止するにはprivateコンストラクターを使用する

作成: 2024-04-28

作成: 2024-04-28 13:38

静的メソッドと静的フィールドのみを含むクラスを使用すると便利な場合があります。


代表的な例として、java.lang.Math、java.util.Arraysなど、数学演算や配列関連のメソッドをまとめたユーティリティクラスがあります。または、java.util.Collectionsのように、特定のインターフェースを実装するオブジェクトを生成する静的ファクトリメソッドをまとめることもできます。


このようなユーティリティクラスは、インスタンス変数やメソッドがなくても使用できるため、コンストラクタは必要ありません。しかし、コンストラクタを明示的に記述しないと、コンパイラが自動的にpublicのデフォルトコンストラクタを作成します。そのため、ユーザーは、このコンストラクタが自動生成されたものなのかを区別することができません。


これを防ぐために、抽象クラスにする場合があります。しかし、抽象クラスではインスタンス化を防ぐことはできません。サブクラスを作成してインスタンス化すればよいからです。



そのため、ユーティリティクラスのインスタンス化を防ぐには、コンストラクタのアクセス修飾子をprivateにする必要があります。



上記のように、デフォルトコンストラクタのアクセス修飾子がprivateの場合、クラスの外部からはアクセスできません。また、デフォルトコンストラクタが内部から呼び出された場合に、例外が発生するようにブロックしています。


このようなprivateコンストラクタは、使用する側からコンストラクタを理解しにくくなる可能性があるため、コメントを付けるのも良いでしょう。ちなみに、コンストラクタをprivateでブロックすると、継承を不可能にする効果もあります。


出典

コメント0