[ 戻る ]
Java読書会BOF「Javaコードアンチパターン」を読む会 第3回¶
日時 |
2026年4月25日(土) 10:00-17:00 |
場所 |
教育文化会館 第3会議室 |
出席者(敬称略) |
高橋(智)、遠藤、加藤、根本、井上、高橋(徹)(記) |
本日は、p.92 3.9.3 クラスの初期化順序 から読み始めました。
Chapter 3 プログラム構造¶
3.9 No.23:正しくない初期化順序¶
3.9.3 クラスの初期化順序¶
p.95 jstackで見るのは大変なので、JConsoleで簡単にデッドロックを検出・可視化できるのでは?
【宿題】デッドロックを起こしやすいTestコードを実行して、JConsoleなどでデッドロック状況を確認してみよう。
p.96 【宿題】循環参照を検出するインスペクターはあるのか?
3.9.4 enumにおける初期化の循環¶
3.10 No.24:スーパークラスのメソッドの呼び出しの漏れ¶
p.99 "refused bequest" 初めて見る英語表現、bequestは遺贈、遺産の意味。図書では「拒否された継承」と訳されている。
3.11 No.25:意図せずstaticと宣言されたフィールド¶
Chaper 4 数値¶
4.1 No.26:8進リテラルの意図しない利用¶
4.2 No.27:数値のオーバーフロー¶
4.2.1 Javaでのオーバーフロー¶
p.110 「このバグは2006年に発見されました」の発見者は、Joshua Bloch ですね。
p.112 「int型のオペランドのうち少なくとも1つが50,000を超える場合」とあるが、50,000とは何か?
50,000を二乗すると、intがオーバーフローする値
p.113 「Math.*Exectメソッドを使う...これらのメソッドはインとリンシック関数と呼ばれます。実際にはメソッドが呼び出されるのではなく、JITコンパイラによって1つまたは2つのCPU命令に置き換えられる」
インライン展開されるということ? メソッド呼び出しのままだとオーバーヘッドが消えない
4.2.2 int型の乗算結果を long型の変数に代入する¶
4.3 No.28:整数による除算における丸め¶
p.117 回避方法の2つの除算の記述は同じバイトコードになる?
同じバイトコードになりました。
4.4 No.29:Integer.MIN_VALUE¶
4.5 No.30:奇数判定と負の数値¶
Math.floorModは、JDK 8から導入
4.6 No.31:精度が失われるワイドニング変換¶
4.7 No.32:無条件ノナローイング変換¶
4.8 No.33:負の16進値¶
4.9 No.34:複合代入における暗黙的な型変換¶
4.10 No.35:除算と複合代入¶
4.11 No.36:short型の使用¶
p.127 Apache POIライブラリでは、Excelの行数をなぜshortで扱っていたのか?
Excel 2003までは最大行数 65,535行(最大列数256列)で、signedであることを意識せずshortを使ったのではないか?
Excel 2007から最大行数 1,048,576行(最大列数16,384列)となった
4.12 No.37:ビット操作アルゴリズムを手作業で記述する¶
4.13 No.38:負のbyte値を忘れる¶
センサーデータ、バイナリの通信フォーマットなどで今でもビット操作が必要な世界がある
4.14 No.39:クランプ処理順序の誤り¶
p.132 OpenJDK 21から、Math.clamp()メソッドが導入された。著者が貢献したコード。
4.15 No.40:特殊な浮動小数点数の誤用¶
4.15.1 符号付きゼロ:+0.0と-0.0¶
4.15.2 非数:NaN値¶
doubleの値がNaNの場合、比較演算でfalseにする処理(実装)は、どこで実現されているのか?
【宿題】バイトコード上は? バイトコードの処理の中なのか? 調べてみよう
4.15.3 Double.MIN_VALUEは最小値ではない¶
次回¶
次回は、p.139 「5章 代表的な例外」から読み始めます。