Open2

TypeScriptのClassで private constructorと通常の constructor の違いや static をつける意味について

まさぴょんまさぴょん

private constructorと通常の constructor の違い

結論:private constructorは、シングルトンパターンのClassとなる

https://zenn.dev/manase/scraps/6a23d6f45146b3

TypeScriptにおいて、private constructor() {}と通常のconstructor() {}の違いは、コンストラクタのアクセス修飾子によってインスタンス化の可否が制御される点です。

  • private constructor() {}:

    • 外部からのインスタンス化が禁止されます。
    • クラス内部またはフレンドクラスからのみコンストラクタを呼び出すことができます。
    • シングルトンパターンの実装や、インスタンスの生成を制御したい場合に利用します。
  • 通常のconstructor() {}(デフォルトでpublic):

    • 外部から自由にインスタンス化できます。
    • 特別なアクセス制限がないため、new クラス名()でインスタンスを生成できます。

staticをつける意味について:

  • クラス自体に属するメンバーを定義します。
  • インスタンスを生成せずに、クラス名から直接アクセスできます。
    • 例: クラス名.staticメソッド()クラス名.staticプロパティ
  • 共有のユーティリティ関数や定数を定義する際に役立ちます。
  • インスタンスごとに存在するメンバーではなく、クラス全体で共有したい場合に使用します。

まとめると:

  • **private constructor()**を使うと、クラスの外部でのインスタンス生成を防ぎ、インスタンス化の制御が可能になります。
  • staticキーワードは、クラスレベルのメンバーを定義し、インスタンスを介さずにアクセスできるようにします。

:

class Singleton {
  private static instance: Singleton;
  private constructor() {}
  
  static getInstance() {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance;
  }
}

// 使用方法
const singletonInstance = Singleton.getInstance();

この例では、private constructor()によって直接のインスタンス化を防ぎ、staticなメソッドgetInstanceで唯一のインスタンスを提供しています。

まさぴょんまさぴょん

private constructor() vs. public constructor()

private constructor()

  • アクセス制御: private修飾子を使用したコンストラクタは、そのクラスの外部からインスタンス化することを禁止します。これにより、クラスのインスタンスを制御し、特定の方法(例えば、ファクトリーメソッドを通じて)でのみインスタンスを生成できるようにします。
  • 使用例: 主にシングルトンパターンやファクトリーパターンで利用されます。シングルトンでは、クラスのインスタンスが一つだけであることを保証します[7][8]。

public constructor()

  • アクセス制御: public修飾子を使用したコンストラクタは、どこからでもインスタンス化可能です。これは、クラスのインスタンスを自由に生成できることを意味します。
  • 使用例: 一般的なクラス設計において、特に特別な制約がない場合に使用されます。

staticキーワードの意味

staticメンバー

  • クラスに属する: staticキーワードを使用すると、そのメンバー(プロパティやメソッド)はクラス自体に属し、インスタンスではなくクラス名を通じてアクセスされます。これにより、インスタンスを生成せずにメンバーにアクセスできるようになります[3][10][12]。

使用例

  • 共通のデータや機能: staticメンバーは、全てのインスタンスで共有されるデータや機能を提供するために使用されます。例えば、クラスのインスタンス数をカウントする静的プロパティや、ユーティリティメソッドなどが考えられます。

まとめ

  • private constructor()は、クラスのインスタンス化を制限し、特定のパターンでの使用を促進します。一方、public constructor()は自由にインスタンスを生成できる設計です。
  • staticキーワードは、クラスに属するメンバーを定義し、インスタンスを介さずにアクセスできるようにします。これにより、クラス全体で共有される機能やデータを提供することが可能になります。