アプリ版:「スタンプのみでお礼する」機能のリリースについて

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
}
}
}

A 回答 (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---」の設計が適切かどうかを見極める必要があります。
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。シングルトンという用語を知らなかったので、調べる良いきっかけになりました。大変助かりました。(1)のパターンで解決しました。

お礼日時:2019/07/04 23:43

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