- PR -

シングルトンになっている?

1
投稿者投稿内容
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 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 );
 }
}

これでもいいのかなと思うのですがどうでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-24 23:26
コンストラクタの目的は、staticフィールドの初期化ではありません。
どちらでもシングルトンは満たしますが、後者のコードにすべきでしょう。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2007-11-24 23:49
結局のところ、コンストラクタをprivateにすれば
そのクラスはシングルトンになるということでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-25 01:53
別にpublicでも、そのクラスを使う側が意図的に一意なインスタンスしか使わなければ、
結果としてシングルトンになります。

シングルトンはインスタンスが一意である事、
通常の使い方においてその一意性を極力保障する事、これが重要です。
そのためにprivateなコンストラクタがよく使われるだけです。

privateだからシングルトンというのは全く関係ありません。
いつ、誰によってnewが呼ばれるかです。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-11-25 10:59
一般的なシングルトンパターンの実装コードだと、大体下の様になってることが多いです。
(未コンパイルなんでそのままじゃ間違いがあるかも)
コード:
public class Singleton {
  private static Singleton instance;
  static {
    instance = new Singleton();
  }
  private Singleton() {
    // 色々初期化
  }
  public static Singleton getInstance() {
    return instance;
  }
  
  public void foo() {
    // do something
  }
}


// how to use
Singleton.getInstance().foo();


かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-25 13:15
最近はDIコンテナを組み合わせることも多くなっていますが、
コンテナのライフサイクルのコントロールでシングルトンというケースもあります。

一般的なシングルトンではstaticメソッドの抽象化ができないため、
多態性を実現することは難しいです。
なので、コンテナ上のライフサイクルによって、
シングルトンを実現するのが現実的だったりします。
1

スキルアップ/キャリアアップ(JOB@IT)