javaの学習中なのですが、以下のBeforeコード、BBB内でBBBをインスタンス化(staticイニシャライザー?)しているのですが、BBBのコンストラクタでの処理をAfterのように分岐させたいのですが、可能でしょうか?
---Before---
AAA.class
public class AAA {
BBB bbb = BBB.getInstance();
}
BBB.class
public class BBB {
private static BBB instance = new BBB();
public BBB getInstance(){
return instance;
}
private BBB() {
// コンストラクタ処理
}
}
---After---
AAA.class
public class AAA {
// ここでどうにかしてisHogeを渡してBBBのコンストラクタでの処理を分岐させたい
BBB bbb = BBB.getInstance();
}
BBB.class
public class BBB {
private static BBB instance = new BBB(isHoge);
public BBB getInstance(){
return instance;
}
private BBB(boolean isHoge) {
if (isHoge) {
// hoge
} else {
// not hoge
}
}
}
No.1ベストアンサー
- 回答日時:
○ isHoge はいつどのように決まるのか?
○「---After---」のやり方は適切なのでしょうか?
これは、プログラム実行中には BBBのインスタンスは1つしか存在しない、という方式(シングルトンと呼ばれる)です。
コンストラクタも実行終了までの間に、ただの1度しか呼ばれません。
シングルトンが適切なのは、次の場合です。
(1)どこかの時点(少なくとも、最初のAAAのインタンスが作られるより前)で isHogeが決定され、二度と変更されない。
(2)isHogeは変化するが、その変更内容を AAAのインスタンスの全てで共用する。
(1) のケースなら
private static BBB instance = null ;にしておいて、getInstance 実行時に instanceがnullのときだけ new BBB(isHoge)する。
(2)のケースなら
コンストラクタではisHogeの分岐はせず、切り替えるためのメソッド( setHogeとか)を用意して使う。
等が考えられます。
ただ、
「// ここでどうにかしてisHogeを渡してBBBのコンストラクタでの処理を分岐させたい」
というコメントがAAAの中にあることから考えると
(3)AAAのインスタンス毎に isHogeのものと !isHogeのものが混在する。
を求めているようにも思えます。
こちらの場合だと
・isHogeと!isHogeの2つのBBBインスタンスを使う。(シングルトンの変形)
・シングルトンの必要が無い。普通に new BBB(isHoge)できるようにする
等になります。
まずは「---After---」の設計が適切かどうかを見極める必要があります。
丁寧なご回答ありがとうございます。シングルトンという用語を知らなかったので、調べる良いきっかけになりました。大変助かりました。(1)のパターンで解決しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- JavaScript JavaScript|特定URLだった時、特定の要素を変更するコードの書き方を教えてほしいです 2 2023/08/25 21:43
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
「インスタンス」の意味をわか...
-
オブジェクト参照がオブジェク...
-
C#において、同じインスタンス...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
エクセル(複数インスタンス)...
-
javaのクラスの作り方、エラー...
-
非staticフィールドを参照でき...
-
String a = "a"; と String b =...
-
VB.NET Newしたものを変数に代...
-
C# クラスの代入について
-
VC++からのocxの使用方法
-
インスタンスを同じ名前で作成...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
エクセル(複数インスタンス)...
-
他のファイルの変数参照
おすすめ情報