Open2
TypeScriptのClassで private constructorと通常の constructor の違いや static をつける意味について
private constructorと通常の constructor の違い
結論:private constructorは、シングルトンパターンのClassとなる
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
キーワードは、クラスに属するメンバーを定義し、インスタンスを介さずにアクセスできるようにします。これにより、クラス全体で共有される機能やデータを提供することが可能になります。