
/**
* アプリケーション全体の設定情報
*/
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と付いてても使えるんじゃないかって
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
「定数のように変化しない」って, どういう意味で使ってる?
final を付けると「変数と値との binding」が固定されるので, その場合だと他のところで
INSTANCE = ....
って書くとエラーになる.
「binding が固定される」だけなので binding を変えない範囲では「インスタンスを変える」ことができる. 例えば Config クラスになにか値を変えるメソッドがあるなら
Config.getInstance().なにか値を変えるメソッド()
のようにすれば「インスタンスを変える」ことはできるよ.
No.4
- 回答日時:
No1 です
>これは、Configインスタンスが定数のように変化しないことを意味するのですか?
static final なのでそうですね。
ただし、private static であればいいので、finalにするかどうかは、Classの設計によります。singletonの必須要件ではありません。
No.3
- 回答日時:
No1です
今回の例は以下のJavaの言語仕様を利用してSingletonを実現しています。
1)Privateで宣言した場合、別のクラスからは呼び出せない
※じつは抜け道はありますが、プログラムはある程度性善説
2)static で宣言すると、newしなくても呼び出せる
この性質を利用して、getInstace() が成立します。
短いプログラムなので、実際に自分で組んで試してみてください。
No.2
- 回答日時:
何をいっているのかわからないんだけど, private ならクラスの「外」からはアクセスできないよ.
えぇと, 「Singletonパターン」がどのようなものか理解していますか... って, まあ singleton には批判もあるんだけど.
No.1
- 回答日時:
実際にやってみましょう。
Config config = new Config
クラス外でnewはできません。
理由は、デフォルトコンストラクタが private だからです。
シングルトンの実装方法は言語によって変わりますが、Javaで実現する場合、以下の要素が基本だと思います。
・private staticのインスタンス変数(シングルトンで管理したいもの)
・private のデフォルトコンストラクタ(外部でnewさせない)
・staticのgetInstance() (これがないと外部で取り出せない)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
オブジェクト参照がオブジェク...
-
フォームのCheck boxとOLEObjec...
-
JSPでの表示
-
プログラミング、シューティン...
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
中学のクラス数
-
「タイプ初期化子が例外をスロ...
-
0歳児の指しゃぶりに関して
-
河合塾
-
VBスクリプトでテキストファイ...
-
javascriptからjavaを呼び出したい
-
エクセルVBAで、条件に一致する...
-
進学校通ってたんですけど、眼...
-
canvasで表示されてる画像を1...
-
河合塾のクラス分けについて
-
多人数のじゃんけんプログラム
-
ヒグマを撃退
-
C# 「データが失なわれる可能性...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
変数名の付け方
-
private static という変数の修飾
-
C#において、同じインスタンス...
-
複数の変数を宣言する時、同時...
-
オブジェクト参照がオブジェク...
-
VB.NET getとsetの概念がわかり...
-
フォームの存在をチェックする方法
-
変数の参照でエラーが出てしま...
-
C# インスタンスの破棄
-
生成したインスタンスを削除す...
-
文字列を日付に変換でParseExce...
-
次の日本語の意味を教えて下さい
-
C#「オブジェクト参照が必要で...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
newしないインスタンス?実体化...
-
C#の構造体の開放のしかた
-
javaのクラスの作り方、エラー...
おすすめ情報
何故privateにするとインスタンス化できないんですか?コンストラクタは無くてもクラスとして機能するんじゃないですか?
private static final Config INSTANCE = new Config();
これは、Configインスタンスが定数のように変化しないことを意味するのですか?