購入前に目次をご確認ください

インプレス[コンピュータ・IT]ムック Javaコードアンチパターン 初級からプロまで知っておきたいミスと回避策

インプレス / 2026年02月12日 / 全375ページ

Javaの神様であるJoshua Blochらが推す、Java開発者のための実践的指南書。現場で遭遇する100のミスに焦点を当て、深刻なバグを未然に防ぐ具体的なアドバイスを提供します。IntelliJ IDEA開発元テクニカルリードである著者が、静的解析の知見から厳選。他者の失敗から学び、堅牢で効率的なコードを書くための「真の現場力」を養います(原題:100 Java Mistakes and How to Avoid Them, Manning Publications)。

目次

  • 商標・サンプル・正誤について
  • 推薦の言葉
  • 目次
  • 序文
  • まえがき
  • 謝辞
  • 著者紹介
  • 本書について
  • 第1章 コード品質の管理
  • 1.1 コードレビューとペアプログラミング1.2 コードスタイル
  • 1.3 静的解析
  • 1.3.1 Java向けの静的解析ツール
  • 1.3.2 静的解析ツールの活用
  • 1.3.3 静的解析の限界
  • 1.3.4 不要な警告の抑制
  • 1.4 自動テスト
  • 1.5 ミューテーションカバレッジ
  • 1.6 動的解析
  • 1.7 コードアサーション
  • 第2章 式2.1 No.1:数値演算子の優先順位に関する誤った思い込み
  • 商標・サンプル・正誤について
  • 推薦の言葉
  • 目次
  • 序文
  • まえがき
  • 謝辞
  • 著者紹介
  • 本書について
  • 第1章 コード品質の管理
  • 1.1 コードレビューとペアプログラミング1.2 コードスタイル
  • 1.3 静的解析
  • 1.3.1 Java向けの静的解析ツール
  • 1.3.2 静的解析ツールの活用
  • 1.3.3 静的解析の限界
  • 1.3.4 不要な警告の抑制
  • 1.4 自動テスト
  • 1.5 ミューテーションカバレッジ
  • 1.6 動的解析
  • 1.7 コードアサーション
  • 第2章 式2.1 No.1:数値演算子の優先順位に関する誤った思い込み
  • 2.1.1 ビットシフト
  • 2.1.2 ビット演算子
  • 2.2 No.2:条件式での括弧の欠落
  • 2.2.1 &&と||の優先順位
  • 2.2.2 条件演算子と加算
  • 2.2.3 条件演算子とnull検査
  • 2.3 No.3:加算のつもりが文字列結合
  • 2.4 No.4:複数行の文字列リテラル
  • 2.5 No.5:単項+
  • 2.6 No.6:条件式における暗黙的な型変換2.6.1 条件式におけるラッパークラスの数値
  • 2.6.2 入れ子の条件式
  • 2.7 No.7:非短絡評価の論理演算子を使う
  • 2.8 No.8:&&と||の混同
  • 2.9 No.9:可変長引数呼び出しの誤った使い方2.9.1 あいまいな可変長引数呼び出し
  • 2.9.2 配列とコレクションの混在
  • 2.9.3 可変長引数呼び出しで基本データ型の配列を使う
  • 2.10 No.10:条件演算子と可変長引数呼び出し
  • 2.11 No.11:重要な戻り値を無視する
  • 2.12 No.12:新たに作成したオブジェクトを使わない
  • 2.13 No.13:間違ったメソッドにメソッド参照を結び付ける
  • 2.14 No.14:メソッド参照で誤ったメソッドを使う
  • 第3章 プログラム構造3.1 No.15:不適切なif-else連鎖
  • 3.2 No.16:前の条件に包含されている条件
  • 3.3 No.17:switch文における意図しないフォールスルー
  • 3.4 No.18:従来構文による不正な形式のfor ループ
  • 3.5 No.19:ループ変数を使っていない
  • 3.6 No.20:ループの方向が誤っている
  • 3.7 No.21:ループのオーバーフロー3.8 No.22:冪等なループ本体
  • 3.9 No.23:正しくない初期化順序
  • 3.9.1 static フィールド
  • 3.9.2 サブクラスのフィールド
  • 3.9.3 クラスの初期化順序
  • 3.9.4 enumにおける初期化の循環
  • 3.10 No.24:スーパークラスのメソッド呼び出しの漏れ
  • 3.11 No.25:意図せずstaticと宣言されたフィールド
  • 第4章 数値4.1 No.26:8進リテラルの意図しない利用
  • 4.2 No.27:数値のオーバーフロー4.2.1 Javaでのオーバーフロー
  • 4.2.2 int型の乗算結果をlong 型の変数に代入する
  • 4.2.3 ファイルサイズ、時間、金額の計算
  • 4.3 No.28:整数による除算における丸め
  • 4.4 No.29:Integer.MIN_VALUEの絶対値
  • 4.5 No.30:奇数判定と負の数値
  • 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型の使用
  • 4.12 No.37:ビット操作アルゴリズムを手作業で記述する
  • 4.13 No.38:負のbyte値を忘れる
  • 4.14 No.39:クランプ処理順序の誤り
  • 4.15 No.40:特殊な浮動小数点数の誤用
  • 4.15.1 符号付きゼロ:+0.0と-0.0
  • 4.15.2 非数:NaN値
  • 4.15.3 Double.MIN_VALUEは最小値ではない
  • 第5章 代表的な例外
  • 5.1 No.41:NullPointerException
  • 5.1.1 nullの回避と防御的な検査
  • 5.1.2 nullの代わりにOptional を使う
  • 5.1.3 null許容性アノテーション
  • 5.2 No.42:IndexOutOfBoundsException
  • 5.3 No.43:ClassCastException
  • 5.3.1 明示的なキャスト
  • 5.3.2 ジェネリック型と暗黙のキャスト
  • 5.3.3 異なるクラスローダー
  • 5.4 No.44:StackOverflowError5.4.1 再帰は深いが有限
  • 5.4.2 無限再帰
  • 第6章 文字列6.1 No.45:charの値が文字であると仮定すること
  • 6.2 No.46:予期しない大文字小文字の変換
  • 6.3 No.47:デフォルトロケールでString.formatを使う
  • 6.4 No.48:フォーマット引数の不一致
  • 6.5 No.49:正規表現ではなく通常の文字列を使う
  • 6.6 No.50:replaceAllを誤って使う
  • 6.7 No.51:エスケープシーケンスを誤って使う
  • 6.8 No.52:大文字と小文字が異なる文字列の比較
  • 6.9 No.53:indexOfメソッドの結果を確認しない
  • 6.10 No.54:indexOfの引数の取り違え
  • 第7章 オブジェクトの比較
  • 7.1 No.55:equalsメソッドの代わりに参照の等価性を使う
  • 7.2 No.56:equals()が内容を比較すると仮定する
  • 7.3 No.57:URL.equals()を使う
  • 7.4 No.58:スケールが異なるBigDecimal同士の比較
  • 7.5 No.59:無関係な型に対してequals()を使う
  • 7.6 No.60:誤ったequals()実装
  • 7.7 No.61:配列フィールドを含む誤ったhashCode()
  • 7.8 No.62:equals()とhashCode()の不一致
  • 7.9 No.63:compare()の特定の戻り値に依存する
  • 7.10 No.64:等しいオブジェクトを比較したときに0を返さない
  • 7.11 No.65:数値を比較するときに減算を使う
  • 7.12 No.66:比較メソッドでNaN値を無視する
  • 7.13 No.67:比較メソッドでオブジェクトをキーの並びとして表現しない
  • 7.14 No.68:コンパレータからランダムな数値を返す
  • 第8章 コレクションとマップ8.1 No.69:関連のない型のオブジェクトを検索
  • 8.2 No.70:単一のオブジェクトとコレクションを混同する
  • 8.3 No.71:null非許容コレクションでのnullの検索
  • 8.4 No.72:マップでnull値を使う
  • 8.5 No.73:変更不可能なコレクションを変更しようとする
  • 8.6 No.74:キーとして変更可能なオブジェクトを使う
  • 8.7 No.75:HashMapやHashSetの出現順序に依存する
  • 8.8 No.76:反復処理中の同時変更
  • 8.9 No.77:List.remove()のオーバーロードを混同する
  • 8.10 No.78:List.remove()の後で次の要素を飛ばしてしまう
  • 8.11 No.79:Collection.removeIf()の中でコレクションを読み取る
  • 8.12 No.80:Map.computeIfAbsent()における同時変更
  • 8.13 No.81:Iteratorの契約に違反する
  • 第9章 その他のライブラリメソッド9.1 No.82:charをStringBuilderコンストラクタに渡す
  • 9.2 No.83:ストリームAPIの処理連鎖内で副作用を発生させること
  • 9.3 No.84:ストリームを2回消費する
  • 9.4 No.85:許可されていない場所でストリームにnull値を使う
  • 9.5 No.86:ストリームAPIの操作の契約に違反する
  • 9.6 No.87:instanceofの代わりにgetClass()を使う
  • 9.7 No.88:enum、アノテーション、クラスに対してgetClass()を使う
  • 9.8 No.89:文字列からブーリアンへの誤った変換
  • 9.9 No.90:日付フォーマットにおける誤った書式指定子
  • 9.10 No.91:弱い参照やソフトな参照の意図しない失効
  • 9.11 No.92:世界が安定していると仮定する
  • 9.12 No.93:並行に更新されるデータ構造へのアトミックではないアクセス
  • 第10章 単体テスト
  • 10.1 No.94:assert文における副作用
  • 10.2 No.95:不正な形式のアサーションメソッド呼び出し
  • 10.3 No.96:不正な形式の例外テスト
  • 10.4 No.97:テストメソッドからの早すぎる終了
  • 10.5 No.98:単体テストでAssertionErrorを無視する
  • 10.6 No.99:等値性の契約の検査にassertNotEquals()を使う
  • 10.7 No.100:不正な形式のテストメソッド
  • 付録A 静的解析用アノテーションA.1 アノテーションパッケージ
  • A.2 アノテーションの種類
  • 付録B 静的解析ツールの拡張
  • B.1 Error Proneプラグイン
  • B.2 SpotBugsプラグイン
  • B.3 IntelliJ IDEAプラグイン
  • B.4 IntelliJ IDEAでの構造検索と置換の利用
  • 訳者あとがき
  • 索引
  • 訳者紹介・レビュアー・STAFF LIST
  • 奥付

※このデジタル雑誌には目次に記載されているコンテンツが含まれています。それ以外のコンテンツは、本誌のコンテンツであっても含まれていません のでご注意ください。

※電子版では、紙の雑誌と内容が一部異なる場合や、掲載されないページがある場合があります。

 

電子書籍は初めての方へ。マガストアで一度購入すると、スマホでもタブレットでもPCでも閲覧できます。

電子書籍は初めての方へ

総合ランキング
2026年02月10日

アプリダウンロード
はこちら

App Store でマガストアをダウンロード Android app on Google Play