[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 13037] 「 Effective Java (第 2 版)」を読む会第 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 <T extends Comparable<? super T>> void sort(List<T>
list) {
	Object[] a = list.toArray();
	Arrays.sort(a);
	ListIterator<T> i = list.listIterator();
	for (int j=0; j<a.length; 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%高速化とあるが、本当にそうなるか試してみよう