/**
* アプリケーション全体の設定情報
*/
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で質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# condaコマンドに対応したプロキシ設定が思うようにならないようです。 2 2022/04/11 17:15
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- デスクトップパソコン 【PC詳しい方!】configってのが書き換えられません! 4 2023/06/29 09:38
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
生成したインスタンスを削除す...
-
エクセル(複数インスタンス)...
-
vb.netでFAXを送信する方法
-
インスタンス参照でアクセスで...
-
javaのクラスの作り方、エラー...
-
C#において、同じインスタンス...
-
VB.NET getとsetの概念がわかり...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
staticメソッドにするかどうか...
-
ASPX(C#)で別ファイルで自分で...
-
JTableの複雑なヘッダー
-
インスタンスフィールドの初期...
-
擬似コード
-
C++Builderで別Formから呼び出...
-
VC++からのocxの使用方法
-
String a = "a"; と String b =...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
VB6.0で、DLLを動的に参照したい
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
-
「インスタンス」の意味をわか...
-
SetWindowsHookExで質問
-
フィールドでのnewとコンストラ...
おすすめ情報
何故privateにするとインスタンス化できないんですか?コンストラクタは無くてもクラスとして機能するんじゃないですか?
private static final Config INSTANCE = new Config();
これは、Configインスタンスが定数のように変化しないことを意味するのですか?