経緯
テレワーク中に新人プログラマーより、if文内にて==比較して同値の値が入っているのに、if文の中に入らないという悩みを相談された。
解決法方法
==で数値比較であれば問題ないが、String変数をイコールにて比較しようとしていた。
対処方法としてequalsメソッドを使用してというだけでは何の成長にもならないかなとは思いつつ、ポインターのアドレスの紹介をするのもなんだなと思った。
即座に回答した内容
コンピューターって数値でしか処理できないから、文字も文字コード表を元に数値があてはめられてるんだよね。
数値と文字はあくまで文字コード表を元にしか変換できないわけで、、、、、、。
↑
この辺から説明が苦しくなる。
結局行きつく先
=はしょせん数値比較でString変数みたいな文字列に関してはここに文字を保存したよってアドレスで保管してるんだよね。同じアドレスだと同じ文字が入ることになるんだよね。
今回の場合にはデータベースからは同じ値を取り出しているんだけど、別々に保管してるんだよね。
だから、別のアドレスが当てはまっている。最初のほうをtest1という変数、test2の変数とすると、test1を編集してもtest2は編集されない。つまりこれって別のアドレスに保管されてるってことになるんだよね。
なんで、今回イコール比較しようとすると、Stringの保管先のアドレスを比較しようとすることになるんで、=比較はできないんだよね。(たとえ、同じ文字列としても、別のアドレスに保管されている値のため)。
これって結局ポインターの概念説明してるんじゃね。
なんでといわれたら
Stringなんかはequalsメソッドで比較しなきゃだめ。(これが一番楽な説明方法)
意図しない編集
編集が画面上で発生しているかどうかを調査するのに、画面上に表示するための変数と別途データベースにもともとある値の比較などという事態が発生して場合にも編集対象の画面のDTOとデータベースのDTOをイコールでコピーみたいなことをすると、同じアドレスになってしまい、イコール比較ができなくなるパターンが存在する。
なので、独自メソッドのクローン関数などを使用して、コピーをしないといけない場合もある。
参考文献