[ 戻る ]

Java読書会BOF「Javaコードアンチパターン」を読む会 第5回

開催概要

日時

2026年6月27日(土) 10:00-17:00

場所

てくのかわさき 第2研修室

出席者(敬称略)

高橋(智)、岩室、遠藤、高橋(徹)(記)

本日は、p. 183 6.5 No.49:正規表現ではなく通常の文字列を使う から読み始めます。

第6章 文字列

6.5 No.49: 正規表現ではなく通常の文字列を使う

  • 【誤植】p.184 下7行目「このsplit()メソッドは」→[quote()メソッドは]

  • Pattern.quote(".")は、文字列 ""\Q.\E"を返す。

    • 正規表現では、Q 〜 E の中のメタ文字をメタ文字として解釈しないとある。

    • Patternクラスにもsplitメソッドはある。String#splitと同じ機能に見える。どちらも Java SE 1.4で導入。

6.6 No.50: replaceAllを誤って使う

6.7 No.51: エスケープシーケンスを誤って使う

6.8 No.52: 大文字と小文字が異なる文字列の比較

6.9 No.53: indexOfメソッドの結果を確認しない

6.10 No.54: indexOfの引数の取り違え

  • p.195 パラメータヒントの設定は?

    • IntelliJ IDEAは、設定 > エディター > インレイヒント

    • Eclipseは、メソッドパラメータ表示

第7章 オブジェクトの比較

  • p.197 「これらのメソッドの契約はJavaのドキュメントで完全に定義されている」はどのドキュメントか?

    • Javadoc APIのObjectクラスのequalsメソッド、hashCodeメソッドに定義の記載あり。

7.1 No.55: equalsメソッドの代わりに参照の等価性を使う

  • p.200 上6行目「リフレクションで16回以上呼び出すと、キャッシュされたBooleanオブジェクトを使う、という最適化された実装が代わりに使われます。」

とあるが、これはHotSpotのJITコンパイルによるものと思われる。

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()実装

  • p.212 equals()、hashCode()をIntelliJ IDEAで生成するとき、すでにequals()とhashCode()のコードが存在する場合、削除して生成してくれる。

  • p.212 recordクラスは、コンストラクタがpublicなのでファクトリークラスで生成するのに向かない

    • recordクラスにはビルダーが欲しい

7.7 No.61: 配列フィールドを含む誤ったhashCode()

  • recordクラスで配列を要素に持つとき、自動生成されるequalsとhashCodeは配列の正しい処理ができない

7.8 No.62: equals()とhashCode()の不一致

  • 前も出てきた大文字小文字の変換が1:1とならない言語(この節ではギリシア語のシグマ)は扱いが大変

7.9 No.63: compare()の特定の戻り値に依存する

  • StringのcompareTo でこの例ではなぜ3が返却される?

    • MとJがASCIIコードで3違っているからではないか。

7.10 No.64: 等しいオブジェクトを比較したときに0を返さない

  • 【宿題】p.222 下2行目「練習問題として、このコンパレータにどのような問題があるのかを理解し、問題のあるコードを正しい方法で書き直してみてください」 を実施しよう

次回

次回は、p.223 7.11から読み始めます。