Java開発の後、Salesforceの開発を始めたのですが、当初色々間違いや勘違いがありました。思い出すことがあったので書いてみます。
booleanの変数の扱い
Javaですとboolean変数は true/false のプリミティブ型で、Booleanと書くとオブジェクトとなりますが、SalesforceではbooleanとBooleanの区別はなく、true/false/nullの3パターンとなります。
次のようにクラスのフィールドに定義した boolean flag; の初期値はnullです。
public class Sample {
boolean flag;
}
Sobjectのチェックボックスの項目はnullを指定するとエラーなので上のflagの値ををそのままチェックボックスの項目にセットするとデータ登録・更新時にエラーになります。
ifの分岐でもflagがtrue以外の時の処理を書く際に、
if( flag == false ){
・・・・
}
と書くと、flagがnullの時に処理を通らずバグになります。
insert後のSobjectのIdは自動でセットされる
SobjectをinsertするとId項目は作成したレコードのIdが入ります。
Account newacc = new Account();
newacc.Name = 'Test1';
・・・
System.debug(newacc.Id);
insert newacc;
System.debug(newacc.Id);
上記のnewacc.Idはinsert前はnullですが、insert後は作成したレコードのSalesforceID
が入ります。
次のようにinsertした後、オブジェクトを再度検索していた所があり、他の箇所で同じタイミングで連続してデータを作成されてバグがでていました。
Account newacc = new Account();
newacc.Name = 'Test1';
・・・
insert newacc;
//なぜか作成日付が最後の行を再度検索
newacc = [select Id, ・・・ from Account Order by CreatedDate desc limit 1];
数式項目や、連番、監査項目などを使いたくて再度検索することはあると思いますが、その場合は次のようにIdを検索条件にいれないとバグになります。
newacc = [select Id, ・・・ from Account where ID = newacc.Id];
文字列が同じ値の判断
Javaの同じ文字列か判断する時は、equalsを使います。Salesforceでもequalsは使えるので同様に書くことはできます。ですが、 Salesforceでは == でも同じ文字列かの判断に使えるので、通常は == を使っていきます。 == を使った場合、両方の文字列がnull の場合trueとなります。ですが、あえてequalsを使い、両方の文字がnullの時にNullPointerExceptionが発生した時がありました。わざわざコード量増やしてバグを出さなくてもと思います。
String var1 = null;
String var2 = null;
//通常の書き方
if( var1 == var2 ){
・・
}
//どうしてもequalsを使いたい
if( (var1 == null && var2 == null) || var1.equals( var2 ) ){
・・
}
最初は色々ありますよね。。