[Effective Java](04)プライベートコンストラクタによるインスタンス化不可能な能力の強化

1569 ワード

静的メソッドと静的ドメインのみを含むクラスの作成は、オブジェクト向けの言語でこのようなクラスを乱用してプロセス化されたプログラムを記述する人もいるため、非難されている.しかし、ツールクラスを作成する場合、ほとんどはインスタンス化する必要がなく、インスタンス化する意味もありません.この場合、クラスがインスタンス化できないことを確認する必要があります.
問題:インスタンス化されていないクラスを作成する場合、コンパイラはコンストラクタを定義していませんが、コンパイラは自動的に公有でパラメータのないデフォルトコンストラクタ(default constructor)を提供し、クライアントは依然としてインスタンス化することができ、クラスを継承し、インスタンス化されたサブクラスによってインスタンス化することができます.
プライベートコンストラクタの定義
public class ToolClass {
    //Supperss default constructor for noninstantiability
    private ToolClass() {
        throw new AssertionError();
    }
}
  • throw new AssertionError()を追加して、インスタンス化ToolClassクラスを回避しました.
  • は非パラメトリックコンストラクタをプライベート化し、クライアントはデフォルトコンストラクタを呼び出してクラスをインスタンス化することはできません.継承されたサブクラスのインスタンス化の問題も回避されます.

  • インスタンス化すると、次のようなエラーが表示されます.
    public class ToolClass {
    
        //Supperss default constructor for noninstantiability
        private ToolClass() {
            throw new AssertionError();
        }
        
        public static void main(String[] args) {
            ToolClass toolClass = new ToolClass();
        }
    }
    

    上記のコードを実行すると、次のエラーが表示されます.
    Exception in thread "main" java.lang.AssertionError
        at g.ToolClass.(ToolClass.java:9)
        at g.ToolClass.main(ToolClass.java:13)
    

    注意:throw new AssertionError()は必須ではありませんが、クラスの内部でコンストラクタを呼び出すのを避けることができます.ToolClassを継承しようとすると、次のエラーが表示されます.
    Implicit super constructor ToolClass() is not visible for default constructor. 
            Must define an explicit constructor