Java のプログラミングについて質問です。


if(hoge != null) {
  hoge.doSomething();
}

hoge が null でないとき doSomething したいのですが、
hoge の値は別スレッドで null に書き換えられてしまう可能性があります。
こういうときは、どういうふうに書くのがよいのでしょうか?
教えて下さい。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/06/18 17:43:41
  • 終了:2010/06/25 17:45:03

回答(2件)

id:hanako393 No.1

hanako393回答回数1142ベストアンサー獲得回数872010/06/18 18:00:55

synchronizedブロックを使います。

https://club.panasonic.jp/fun/sec/mp/login.do?PAGE_CTRL_STATUS=C...

id:akagi_paon

こゆこと?

private Hoge hoge = new Hoge();

public void assignNull() {
  synchronized(this) {
    hoge = null;
  }
}

public void execute() {
  synchronized(this) {
    if(hoge != null) {
      hoge.doSomething();
    }
  }
}

これって hoge を書き換えるときはいつも synchronized しなくちゃいけないんじゃない?

めんどくさ~。

→ そうか。setHoge() を作って synchronized しちゃえばいいのか。

private Hoge hoge = new Hoge();

public void assignNull() {
  setHoge(null);
}

public void execute() {
  synchronized(this) {
    if(hoge != null) {
      hoge.doSomething();
    }
  }
}

public void setHoge(Hoge hoge) {
  synchronized(this) {
    this.hoge = hoge;
  }
}

こうか。

→ ていうか Null Object 使った方がコスト安くない?

private volatile Hoge hoge = new Hoge();

public void assignNull() {
  setHoge(null);
}

public void execute() {
      hoge.doSomething();
}

public void setHoge(Hoge hoge) {
  if(hoge == null) {
    this.hoge = NullHoge.getInstance();
  } else {
    this.hoge = hoge;
  }
}
2010/06/18 19:41:12
id:t-wata No.2

t-wata回答回数82ベストアンサー獲得回数132010/06/19 08:37:16

ポイント70pt

http://q.hatena.ne.jp

メソッド内で宣言したローカル変数なら、外のスレッドからいじられることはないから、

フィールドからいったんローカル変数にいれて、その後でnullかどうかを判定すればいいと思うけど。

void hogehoge(){
Hoge _hoge = this.hoge; //参照のコピーを作る
//この後は、this.hoge = null; してもされても _hogeの参照は最初のまま
id:akagi_paon

なるほど!

2010/06/19 09:31:08

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません