Winter ’21で新しくApexのNULL条件演算子の機能が追加されたのでその概要について、以下の資料の英文を要約して整理してみました。
参考資料
Learn MOAR with Winter ’21: Safe Navigation in Apex
概要
「左辺がNULLのときは、NullPointerExceptionを発生させずにNULLを返す」というような処理をいちいち書かなくてよくなる。
要は、NULLチェックの毎回の煩雑なコードを単純化できる。
書き方
従来の書き方
if(var != null) {
var.doStuff();
}
新しいNULL条件演算子を利用した書き方
var?.doStuff();
使用例
式が複雑になればなるほど、この演算子は効果を発揮する。
SOQL文
results = [SELECT Name FROM Account WHERE Id = :accId];
if (results.size() == 0) { // Account doesn't exist, isn't visible, was deleted, etc
return null;
}
return results[0].Name;
従来は上記のように書いていたものを、この演算子を利用すれば以下のように簡略に記述できる。
return [SELECT Name FROM Account WHERE Id = :accId]?.Name;
ネスト
複雑なネスト構造の文も簡略に記述することができる。
public with sharing class Character{
private static final String CHARACTER_DETAILS_PARTITION = 'CharacterDetails';
public static List<String> getHobbiesFromCache(String name){
Cache.Partition part = Cache.Org.getPartition(CHARACTER_DETAILS_PARTITION));
if(part == null){
return null;
}
CharacterDetails data = (CharacterDetails)part.get(name);
if(data == null){
return null;
}else{
return data.getHobbies();
}
}
}
上記のgetHobbiesFromCache()メソッドは以下のように1文に簡略化できる
return (CharacterDetails)Cache.Org.getPartition(CHARACTER_DETAILS_PARTITION)?.get(name))?.getHobbies();
ただし、簡略化にはなってものの可読性が落ちることもあるので、下記のような書き方が推奨されている。
CharacterDetails namedCharacter = (CharacterDetails)Cache.Org.getPartition(CHARACTER_DETAILS_PARTITION)?.get(name));
return namedCharacter?.getHobbies();