[ 戻る ]
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から読み始めます。