読書会(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
list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator
for (int j=0; j
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%高速化とあるが、本当にそうなるか試してみよう
[ 戻る ]