糞コードを見て思った事

先日、こんな糞コードをみつけた。

String hoge = "";
if (!a.equals(b)) {
  hoge = b;
} else {
  hoge = a;
}

最初見た時に違和感を感じたのでよく見たらこれは簡潔に書ける。

String hoge = b;

一応解説。
上記コードは「!」があるからわかりくい。*1
「!」を取るとaとbが等しい場合にはa、そうでない場合にはbという事になる。

String hoge = "";
if (a.equals(b)) {
  // ここは「hoge = b」でも良い
  hoge = a;
} else {
  hoge = b;
}

aとbが等しいならaじゃなくてもbでもいいという事。

String hoge = "";
if (a.equals(b)) {
  hoge = b;
} else {
  hoge = b;
}

勿論プリミティブ型も同じ。

int hoge = 0;
if (a == b) {
  hoge = a;
} else {
  hoge = b;
}
int hoge = b;

別にここまでだったら特になんという事もない。
ただ、これは文字列だから成り立つわけで、オブジェクトの場合はそうでない事もある。
というのもJavaではequalsは全ての要素を比較している訳じゃないのでequalsで比較していない要素がある場合には下記のコードは必要なこともあるかもしれない。
*2

Hoge hoge = null;
if (a.equals(b)) {
  hoge = a;
} else {
  hoge = b;
}

何が言いたいかというと、糞コードから考えることもあるなぁっと。
こんなコードがあるだけならともかく、こんなコードがコピペ量産されているという現実から目を逸らしたかったという。。。orz

こんなケースがあるのかわからないけど、このコードの場合はインスタンスを比較しているので最初のコードと同じ事が言える。

Hoge hoge = null;
if (a == b) {
  hoge = a;
} else {
  hoge = b;
}
Hoge hoge = b;

*1:aとbが等しくない時にはbで、そうでない時にはa

*2:そもそもequalsの実装がおかしい気がしますが。