【Salesforce】SObjectの比較

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です