[ 戻る ]

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章 代表的な例外」から読み始めます。