
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
文字列を日付に変換でParseExce...
-
C# インスタンスの破棄
-
インスタンス参照でアクセスで...
-
フォームの存在をチェックする方法
-
生成したインスタンスを削除す...
-
インスタンスとスレッドの違い
-
VB6.0で、DLLを動的に参照したい
-
簡単電卓をjavaプログラムで作...
-
C#において、同じインスタンス...
-
フォームのCheck boxとOLEObjec...
-
マルチスレッド間でデータ交換...
-
【java】コンストラクタの処理...
-
VB.netで標準モジュールからフ...
-
カンマ区切りの数値文字列を数...
-
javaのクラスの作り方、エラー...
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
private static という変数の修飾
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
生成したインスタンスを削除す...
-
オブジェクト参照がオブジェク...
-
C#において、同じインスタンス...
-
C# インスタンスの破棄
-
変数の参照でエラーが出てしま...
-
インスタンスを同じ名前で作成...
-
VB.NET getとsetの概念がわかり...
-
newしないインスタンス?実体化...
-
javaのクラスの作り方、エラー...
-
非staticフィールドを参照でき...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
フォームの存在をチェックする方法
-
大量のデータとインスタンスの...
-
C#「オブジェクト参照が必要で...
-
String a = "a"; と String b =...
おすすめ情報