【Salesforce】SObjectの比較
SalesforceでApexで書かれたコードを確認をしていると、こんなコードに出会いました。
実際には全然違うのですが、イメージはこんな感じです。
Account acc;
// 取引先を取得する
acc = getAccount();
// 取引先が取得できなかった場合の処理
if(acc == new Account()){
// 処理を行う
}
取引先を取得出来たかどうか、新しいインスタンスと比較しているようです。
これを見た瞬間、これは動かないのではと思いました。
しかし、テストではちゃんと動いていた部分です。
というわけで、ちょっと確認してみました。
Account acc1;
Account acc2;
// 取引先を作成する
acc1 = new Account();
acc2 = new Account();
// true
system.debug('【ログ】' + (acc1 == acc2));
// Nameを変更してみる
acc1.Name = 'test';
// false
system.debug('【ログ】' + (acc1 == acc2));
// Nameを同じにしてみる
acc2.Name = acc1.Name;
// true
system.debug('【ログ】' + (acc1 == acc2));
// 実際に取得してみる
acc1 = [select Id, Name from Account limit 1];
// 複製してみる
acc2 = acc1.Clone(true, true);
// true
system.debug('【ログ】' + (acc1 == acc2));
// IDもコピー
acc2 = acc1.Clone(false, true);
// false
system.debug('【ログ】' + (acc1 == acc2));
初歩的な部分ですが、演算子についてちょっと調べました。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_expressions_operators_understanding.htm
参照が合っているかを確認する場合は===を使えばいいのですね。
Account acc1;
Account acc2;
// 取引先を作成する
acc1 = new Account();
acc2 = new Account();
// false
system.debug('【ログ】' + (acc1 === acc2));
// Nameを変更してみる
acc1.Name = 'test';
// false
system.debug('【ログ】' + (acc1 === acc2));
// Nameを同じにしてみる
acc2.Name = acc1.Name;
// false
system.debug('【ログ】' + (acc1 === acc2));
// 実際に取得してみる
acc1 = [select Id, Name from Account limit 1];
// 複製してみる
acc2 = acc1.Clone(true, true);
// false
system.debug('【ログ】' + (acc1 === acc2));
// IDもコピー
acc2 = acc1.Clone(false, true);
// false
system.debug('【ログ】' + (acc1 === acc2));
これを理解してコードを書いたのであれば良いのですが、それでもちょっと怪しいコードですよね。
素直にIDが取得できたかどうかで判断した方が分かりやすい気がします。
ともあれ、ちょっと勉強になりました。
No comments.