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