privateなコンストラクタのクラスについて
privateなコンストラクタを持つクラスに、非staticなメンバーが存在している場合、それらに対してどのようにアクセスしたらいいのかを調べてみた。
無論、自クラス内ではたとえprivateなコンストラクタであってもインスタンスは作成可能であり、アクセスに問題はない。
問題は、他のクラスからどのようにしてアクセスするかだ。
というか、そもそもprivateなコンストラクタとは、外部のクラスでインスタンスを作成させないこと、つまり、そのクラスのオブジェクトは一つのみしか存在させないことに狙いがある。
ただし、だからと言って外部からアクセスできないというのは必然ではない。
オブジェクトの唯一性と公開性とは別物である。
結論から言うと、アクセスは可能である。
方法は2種類在って、それぞれに利点と欠点がある。
それは以下の2つである。
1.staticフィールドにオブジェクトを保持する。
2.staticメソッドでオブジェクトをリターンする。
1の方法はアクセスは容易であり、分かりやすい、普通はこちらが使われる。
もしオブジェクトが状態を持っているのならば、1の方法しかない。
1の方法の欠点は、staticのため、メモリに常駐し続けてしまうという点だ。
GCの対象にならないので、もしそれが重いクラスとなるとメモリ領域が圧迫されてしまう。
もしオブジェクトが状態を持たず、かつ頻繁に使用されないのならば、2の方法の方がいいだろう。
この方法の場合、使用するときにのみオブジェクトを生成して使用後にはGCによって破棄される。
(ただし、別のインスタンスに接続した場合はすぐには破棄されない)
ちなみにprivateコンストラクタのクラスを継承することはできない。
したがって、privateコンストラクタのクラスのオブジェクトにアクセスするには、前述の方法を取るしかない。
このprivateコンストラクタの方法は、一般的にはシングルトンと呼ばれるデザインパターンである。
この意味は、あるクラスのオブジェクトの存在を唯一のものとするという狙いである。
ただし、もしオブジェクトを唯一のものとするのならば、staticフィールド・メソッドを使用することでも同じことが可能である。
ただし、シングルトンの利点として、存在するオブジェクトの個数を1つ以外の個数にコントロールすることができるという点がある。
それは、具体的にはオブジェクトを保持するstaticフィールドの数でコントロール可能なのである。
だからシングルトンという名前はあまりよくないのかもしれない。
以下はソース例。
public class C19 {
public static void main(String[] args) {
// staticメソッドを使用する方法
C19_2.getC19_2().m();
// staticフィールドを使用する方法
C19_2.c19_2.m();
}
}
class C19_2 {
static C19_2 c19_2 = new C19_2();
private C19_2(){}
void m(){System.out.println("a");}
static C19_2 getC19_2(){
return new C19_2();
}
}
出力:
a
a
| 固定リンク
コメント