Salesforce の Apex 開発で、文字列比較はよく行うことでしょう。
記事にするまでもないとは思いますが、 Java 開発に慣れている人が初めて Apex コードを書くときに違和感に悶えることになると思うので念のため書いておこうと思います。
最初に結論
equals
を使いましょう。
==
で書かれているコードを見ると残念な気持ちになります。
Apex での等価演算子による文字列の比較
先ほど挙げた、等価演算子 (==)
を使うのが、最も基本的な文字列比較方法でしょう。
しかし、
「基本的」 とは言いましたが、「推奨」 とは言っていません。
「基本的」 とは言いましたが、「推奨」 とは言っていません。
「基本的」 とは言いましたが、「推奨」 とは言っていません。
大事なことなので繰り返します。
注意点は後述します。まずは説明だけしておきましょう。
==
演算子では、二つの文字列が完全に一致するかどうかをチェックします。
Java に慣れてる人は目を丸くするか泡を吹くことでしょう。
String str1 = 'Hello';
String str2 = 'Hello';
Boolean isEqual = str1 == str2; // true が返る
一方が null でも動作します。NPEなどは気にしなくて良いです。念の為。
Java と Apex の違い
Javaでは、==
演算子は基本的にオブジェクトの参照が等しいかどうかをチェックします。
これは、二つのオブジェクトがメモリ上で同じ場所を指しているかどうかを確認することを意味します。つまり、異なる二つのStringオブジェクトが同じ文字列を保持していても、==
はfalseを返します。
これは、文字列が異なるメモリ位置に存在するためです。文字列の内容を比較するには、equals()メソッドを使用する必要があります。
Java でこんな書き方をすると、アンチパターンを全力で踏みにいっていますね。
一方、Salesforce Apexでは、==
演算子はオブジェクトの内容を比較します。
Apex の==
は、 Java の equals()
メソッドに似た動作をします。
つまり、二つのStringオブジェクトが同じ値を持っていれば、==
はtrueを返します。
これはApexがより高レベルの抽象化を提供し、開発者がより直感的にコードを書けるようにするための設計思想だと考えられますね。
(その配慮の良し悪しは別として...)
等価演算子 (==) の注意点
大文字小文字を区別しない
==
演算子は、Apex セマンティックを一致させるために大文字と小文字を区別しない比較を実行します。
大文字小文字を区別したいなら、 equalsIgnoreCase
を使う必要があります。
コンテキストユーザのロケールに依存する
これが一番の問題点です。
== を使用した文字列の比較は、大文字と小文字が区別されず、コンテキストユーザのロケールに従って実行されます。
具体的には、日本と英語圏でのロケールの違いであれば、AAA
(半角) と AAA
(全角) の結果が異なります。
実行ユーザによって挙動が変わってしまうコードなど、安心して使えません。
素直に、 equals を使いましょう。
おまけ
equals を使う場合、 str1.equals(str2)
という書き方になります。
このとき、 str1 が null の場合は NullPointerException になります。
気をつけましょう。
(str2 は null を許容します)
おわりに
簡単に書けるからと言って、安易に書いてはいけません。
急がば回れ。
コメント