【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.