- - PR -
シングルトンになっている?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-11-24 21:54
public class A01 {
public static void main(String[] args) { System.out.println( Prop_A.getMsgString( "MSG_KEY" ) ); System.out.println( Prop_A.getSysString( "SYS_KEY" ) ); } } public class Prop_A { private static Prop_A propA = new Prop_A(); private static ResourceBundle rbMsg = null; private static ResourceBundle rbSys = null; private Prop_A() { rbMsg = ResourceBundle.getBundle( "msg_a" ); rbSys = ResourceBundle.getBundle( "sys_a" ); } public static String getSysString( String key ) { return rbSys.getString( key ); } public static String getMsgString( String key ) { return rbMsg.getString( key ); } } Prop_Aクラスはシングルトンになっていますでしょうか? getSysStringとgetMsgStringをどこからも使えるようにしたいです。 public class Prop_A { private static ResourceBundle rbMsg = ResourceBundle.getBundle( "msg_a" ); private static ResourceBundle rbSys = ResourceBundle.getBundle( "sys_a" ); private Prop_A() { } public static String getSysString( String key ) { return rbSys.getString( key ); } public static String getMsgString( String key ) { return rbMsg.getString( key ); } } これでもいいのかなと思うのですがどうでしょうか? | ||||
|
投稿日時: 2007-11-24 23:26
コンストラクタの目的は、staticフィールドの初期化ではありません。
どちらでもシングルトンは満たしますが、後者のコードにすべきでしょう。 | ||||
|
投稿日時: 2007-11-24 23:49
結局のところ、コンストラクタをprivateにすれば
そのクラスはシングルトンになるということでしょうか? | ||||
|
投稿日時: 2007-11-25 01:53
別にpublicでも、そのクラスを使う側が意図的に一意なインスタンスしか使わなければ、
結果としてシングルトンになります。 シングルトンはインスタンスが一意である事、 通常の使い方においてその一意性を極力保障する事、これが重要です。 そのためにprivateなコンストラクタがよく使われるだけです。 privateだからシングルトンというのは全く関係ありません。 いつ、誰によってnewが呼ばれるかです。 | ||||
|
投稿日時: 2007-11-25 10:59
一般的なシングルトンパターンの実装コードだと、大体下の様になってることが多いです。
(未コンパイルなんでそのままじゃ間違いがあるかも)
| ||||
|
投稿日時: 2007-11-25 13:15
最近はDIコンテナを組み合わせることも多くなっていますが、
コンテナのライフサイクルのコントロールでシングルトンというケースもあります。 一般的なシングルトンではstaticメソッドの抽象化ができないため、 多態性を実現することは難しいです。 なので、コンテナ上のライフサイクルによって、 シングルトンを実現するのが現実的だったりします。 |
1