オブジェクト指向と言いつつ、クラスをインスタンス化させたくない場面は
よくあることです。
私の経験上では主に2つ。
- ユーティリティクラス
他の色々なクラスから共通で利用されるメソッドを実装する。
共通関数群のような使い方をするが、そのたびにクラスを
インスタンス化して利用するのはコードもわかりにくくなるし、
そもそもオブジェクトとして利用する意味がない。
この場合、Java等でも同様だと思うが、staticなメソッドを定義し
インスタンス化せずに手軽に共通メソッドを利用できるようにする。
その際、インスタンス化自体が無意味なので、コンストラクタを
private で宣言するのが一般的です。
public class StringUtil
{
private StringUtil
{
//インスタンス化不可
}
public static Find(string source, string search)
{
return ...
}
} - シングルトンクラス(シングルトンパターン)
オブジェクトをシングルトンにしたい場合に使用する。
シングルトンとはアプリケーション内であるクラスのインスタンスは
唯一であることを保証するクラスのこと(例:プリンタスプーラなど)
クラスが内部的にそのクラスのオブジェクトをひとつだけインスタンス化し、
インスタンスが必要な場合にかならず、唯一のオブジェクトへの参照を
返すという仕組みである。
public class Singleton
{
private static obj = new Singleton();
private Singleton
{
//インスタンスの取得は、GetInstanceメソッドで
}
public static Singleton GetInstance
{
return obj;
}
}
C#2.0からは、上記のように、無理やりコンストラクタを、privateにして
インスタンス化できないようにするという、よく考えると無理やりな手法
ではなく以下のようにスマートに記述できるようになった。
class定義の前に、staticを付加すると、そのクラスは自動的に静的な
クラスとなり、以下のような特徴を持つようになる。
- 静的メンバのみを含みます。
- インスタンス化できません。
- シールされます。
- インスタンスコンストラクタを含むことができません
コンストラクタを記述しても言語レベルでエラーが検出され、
コンパイルすることができなくなります。
このクラスを利用し、静的フィールド、静的メソッドだけを使用した
ユーティリティクラスやシングルトンの仕組みも簡単に実装できます。
コメントする