【Salesforce】String型についての勘違い
Salesforceで開発していて、よく使う型の中にString型があります。
私は基本的にApexで使用する場合にはブランク(”)を設定した後に使用します。
String型の文字列は宣言しただけだとnullが入っているため、そのようにしています。
うっかりnullのまま使用するのを防ぐためです。
String str;
system.debug(str); // null
str.equals('TEST'); // null参照エラー
一方で、SObject型のテキスト項目を使用する場合はそのようなことをしません。
比較する場合は比較対象の文字列にてStringのメソッドを使用しています。
取引先の取引先番号で例を示します。
Account acc; String str; // 取引先を作成する acc = new Account(); acc.Name = 'TEST'; insert acc; acc = [select Id, AccountNumber from Account where Id = :acc.Id]; str = '012345'; str.equals(acc.AccountNumber); // 比較対象の文字列を使用
strに値が設定されているため、null参照エラーは発生しません。
前置きが長くなってしまいましたが、ここからが本題です。
SObjectのテキスト項目に対して文字列を設定した場合、設定した文字列が必ず設定されているものと思っていました。
その思い込みで作成したコードは、思わぬ結果となりました。
Account acc;
String str;
// AccountNumberに設定する文字列
str = '';
// 取引先を作成する
acc = new Account();
acc.Name = 'TEST';
acc.AccountNumber = '';
insert acc;
// 再取得前
system.debug('【ログ】str : ' + str); // ブランク
system.debug('【ログ】acc.AccountNumber : ' + acc.AccountNumber); // ブランク
system.debug('【ログ】str.equals(acc.AccountNumber) : ' + str.equals(acc.AccountNumber)); // true
acc = [select Id, AccountNumber from Account where Id = :acc.Id];
// 再取得後
system.debug('【ログ】str : ' + str); // ブランク
system.debug('【ログ】acc.AccountNumber : ' + acc.AccountNumber); // null
system.debug('【ログ】str.equals(acc.AccountNumber) : ' + str.equals(acc.AccountNumber)); // false
SELECTで再取得する前は、当然のようにTRUEが返ってきます。
設定した値と設定された値を比較しているのですから当然ですね。
しかし、レコードを再取得したことによって取引先番号の項目にnullが設定されており、比較した結果はfalseとなっています。
これにより、私が書いたロジックは思わぬ動きをしていました。
調べてみると、ちゃんと書いてありますね。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_primitives.htm
SObjectのString項目には空白が設定できないそうです。
それゆえに、String項目に空白を設定するとnullの項目とされてしまうのでしょうね。
確認してみると、選択リストの項目でも同じことが起きました。
まだまだ知識不足ですね。
No comments.