プロが教えるわが家の防犯対策術!

/**
* アプリケーション全体の設定情報
*/
public class Config {
/**
* 外部からインスタンス化できないよう、コンストラクタをprivateで宣言する
*/
private Config() {
// 実際はファイル・データベースなどから設定情報を
// 読み込む処理をここに書く
}

/**
* 唯一のインスタンスを返す
* @return このクラスの唯一のインスタンス
*/
public static Config getInstance() {
return ConfigInstanceHolder.INSTANCE;
}

/**
* 指定されたキーに対応する設定値を返す
* @param key 設定キー
* @return 設定値
*/
public String getValue(String key) {
// 実際はコンストラクタで読み込んだ設定情報を
// 返す処理をここに書く
return ....;
}

/**
* Configクラスの唯一のインスタンスを保持する内部クラス
*/
public static class ConfigInstanceHolder {
/** 唯一のインスタンス */
private static final Config INSTANCE = new Config();
}
}
以上のコードで分からないのがConfig config = new Configして、config.Config()って出来るんじゃないかって思ってしまうんですよね。Configをインスタンス化すれば例えprivateと付いてても使えるんじゃないかって

質問者からの補足コメント

  • 何故privateにするとインスタンス化できないんですか?コンストラクタは無くてもクラスとして機能するんじゃないですか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/06/12 23:40
  • private static final Config INSTANCE = new Config();
    これは、Configインスタンスが定数のように変化しないことを意味するのですか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/06/13 17:29

A 回答 (5件)

「定数のように変化しない」って, どういう意味で使ってる?



final を付けると「変数と値との binding」が固定されるので, その場合だと他のところで
INSTANCE = ....
って書くとエラーになる.

「binding が固定される」だけなので binding を変えない範囲では「インスタンスを変える」ことができる. 例えば Config クラスになにか値を変えるメソッドがあるなら
Config.getInstance().なにか値を変えるメソッド()
のようにすれば「インスタンスを変える」ことはできるよ.
    • good
    • 0

No1 です



>これは、Configインスタンスが定数のように変化しないことを意味するのですか?

static final なのでそうですね。
ただし、private static であればいいので、finalにするかどうかは、Classの設計によります。singletonの必須要件ではありません。
    • good
    • 0

No1です



今回の例は以下のJavaの言語仕様を利用してSingletonを実現しています。

1)Privateで宣言した場合、別のクラスからは呼び出せない
※じつは抜け道はありますが、プログラムはある程度性善説

2)static で宣言すると、newしなくても呼び出せる
この性質を利用して、getInstace() が成立します。

短いプログラムなので、実際に自分で組んで試してみてください。
この回答への補足あり
    • good
    • 0

何をいっているのかわからないんだけど, private ならクラスの「外」からはアクセスできないよ.



えぇと, 「Singletonパターン」がどのようなものか理解していますか... って, まあ singleton には批判もあるんだけど.
    • good
    • 0

実際にやってみましょう。



Config config = new Config

クラス外でnewはできません。
理由は、デフォルトコンストラクタが private だからです。

シングルトンの実装方法は言語によって変わりますが、Javaで実現する場合、以下の要素が基本だと思います。

・private staticのインスタンス変数(シングルトンで管理したいもの)
・private のデフォルトコンストラクタ(外部でnewさせない)
・staticのgetInstance() (これがないと外部で取り出せない)
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!