プログラマ38の日記

主にプログラムメモです。

Salesforce: Apex開発で最初の頃にやってしまった間違い

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 ) ){
・・
}

 

最初は色々ありますよね。。