読書会(Effective Java (Second Edition))第7回議事録

[ 戻る ]


Java読書会「Effective Java 第2版を読む会(第7回)」議事録

日時:2009年2月21日(土)
場所:てくのかわさき 第5研修室
参加者(敬称略):
遠藤、高江洲、門脇、有賀、村山、松永、スズキ、岩室、高橋(智)、根本、
小棚木、尾関、高橋(徹)[記]

本日の範囲:pp236-275(項目58-71)
次回は残りが少ないので、読了後レクリエーションを予定します。
皆様、読書会参加の感想をブログなどに書いていただけると幸いです。

---
項目58

p.237下7行「例外の文字列表現を解析するコードは…」の解析するとはどうい
うこと?
 →例えば、例外文字列にORACLEと入っていたら、ORACLEのエラーと判
 断すること
  →文字列の解析ではなくエラーコードを設けるのが一般的な解決
  →例外の文字列もローカライズ対象になって変わってしまうこともある
   → 例外クラス(java.lang.Throwable)にgetLocalizedMessage()が用意
   されている
    →但しJavaVMのロケールに固定され引数で任意に指定は不可
   →国際化機能については数少ないが書籍「JAVA国際化プログラミング」
   がオライリーから出版されている
    →会場では「風間さん著では」とのことでしたが、「風間さん訳」で
    した
   →「CJKV日中韓越情報処理」もオライリーから出版。原書は第2版が年
   末出たばかり。

項目59

ここで紹介されている「状態検査メソッドとチェックされない例外を使用する
場合の呼び出し」リファクタリングは初めて見るけど一般的か?
 →.NETでは見かける。チェック例外がないから
 →「契約による設計(DbC)」では、事前条件を利用者側が検査するので、
 状態検査メソッドを用意する
  →DbCをサポートする言語は、Eiffel, D言語, Delphi(Prism)の3言語
   → (議事録作成時追加)Satherというのもある(Eiffel派生?)

try-catchの括りをどこまで大きくするか悩みがある
 →大きく囲えばどこで例外がスローされたか分からないし、小さく囲えば大
 量のtry-catch文で正常シーケンスが逆に見通し悪くなる


項目60

NullPointerExceptionは自分でスローするコードを書かねばならないのか?
null参照へのメソッド呼び出しで自動的にスローされるから不要では?
 →引数チェックでnullの場合だけNullPointerExceptionをスローし、それ
 以外の違反はIllegalArgumentExceptionと慣例でしているが、引数にnullが
 渡された場合もIllegalArgumentExceptionでよいとの意見もある
 →ドキュメントに事前条件、例外をすべて書くのか
  → そう。ただし大変なので、publicメソッドに限定すればよい
 → assertを使えば楽にはなる
  → でも実行時にON/OFFできてしまう
   → 実行時もONのままという意見もある

項目62

メソッドではなくクラスのコメントに@throwsを記述できるのか?
 → できるみたい
 → Ecilpseだとメソッドのドキュメントしか見ないからクラスコメントだと
 見落とされるのでは

項目63

難読化ツールを使うとスタックトレースのクラス・メソッド名がソースと合わ
なくなるね

項目64

Collections.sortは本当に途中で失敗しても変更されない?
 → JDK1.6のコード抜粋
  public static > void sort(List
list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator i = list.listIterator();
    for (int j=0; j       i.next();
      i.set((T)a[j]);
    }
  }

項目65

FindBugsで空のcatch節を検出できるか

JUnitだと例外をスローするコードをテストするときに空のcatch節を書く
 →JUnit4だと書かなくてもよい

設計上絶対に発生しない例外をcatchしなくてはならないときはどうすれば?
 →Goez氏によるとAssertionErrorをスローする方法があるとのこと
  } catch (NeverThrownException e) {
    throw AssertionError();
  }

実装パターン(ケント・ベック著)では、例外の使用はかなり否定的
 →興味あるかたは次回のズームインJavaにご参加ください

項目66

AtomicLong等は、内部でCPUのCAS命令などを使ってアトミックなインクリメン
トを実現している

Rubyは1.9からネイティブスレッドがサポートされているが、変数のスレッド
間での共有はどうすればいいのだろうか?

【宿題】本項目のコード(synchronized版、volatile版、Atomic版)の3つを
ベンチマークで比較しよう
 →どなたかベンチマークコードの提供求む!
  →デュアルコア、クァッドコア、シングルコアで皆様比較して結果を
  報告しよう!

項目67

p.256 上12行目誤植か?
 「セットが要素に追加…」
  →「セットに要素が追加」か「要素がセットに追加」では?

文字列の+演算は、コンパイラがStringBuilderを使うコードを生成する
 →昔はStringBufferだった。いつから? どのコンパイルオプションで切り
 替えられるか?

項目68

[Goetz 06]の書籍(Java Concurrency in Practice)の翻訳本「Java並行処理
プログラミング」は既に入手困難。
 →このあいだ出たばかりなのに…
 →正月10件以上書店に電話しまくって、やっと1冊確保した
 →せめて増刷しないなら、PDF版でも販売してくれないか?
 →最近技術書がすぐに入手不可になることが多い。悲惨な技術書籍出版事情

項目69

p.267 上6行目誤植か?
 「単一の循環バリアーで」
  → CyclicBarrierではないか(Javaのクラス名なので。前頁ではアルファベッ
 ト表記のままだった)

p.267 「システムのリアルタイムクロックの調整」とは?
 →OSの時刻を変えてしまった場合、NTPで時刻の進みが調整されている場合

p.268 偽りの目覚め どのような時に発生するのだろうか
 → Linuxでは、シグナルを受けてシグナルハンドラが動いたときか?

項目70

【宿題】new byte[0]とnew Object()とどちらが省メモリ・高性能かを
プロファイラを使って調べてみよう!
 → NetBeansには標準でプロファイラがついている。Eclipseは?

項目71

初期化循環とは?
 → Aのインスタンス化時にBが必要
   Bのインスタンス化時にAが必要
   となって、初期化ができないこと

二重チェックイディオムのローカル変数の代入の意義は?
 → volatile変数へのアクセスが減らせる
 →【宿題】本では25%高速化とあるが、本当にそうなるか試してみよう


[ 戻る ]