Prefer using '??=' over testing for nullについて(Null-aware Operatorsまとめ)
if (database == null) { database = openDatabase( join(await getDatabasesPath(), 'track_data.db'), ); }
というコードを書いたらPrefer using '??=' over testing for nullと注意されました。
'??='とはDartのNull-aware Operatorsというものだそうです。
以下、Null-aware Operatorsを紹介します。
??
exp ?? otherExp
とすると、これはexpがnullでない場合expを、expがnullである場合otherExpを返します。
??=
obj ??= value
とすると、objがnullの時objにvalueを代入し、objがnullでない時は代入操作を行いません。
?.
?.はオブジェクトがnullでない時にメソッドやゲッターを呼び出したい時に使用します。
obj?.method()
とすると、objがnullの時はnullを、nullでない時はobj.method()を返します。
obj?.child1?.child2?.getter
とすると、obj,child1,child2のいずれもnullでない時にゲッターを返します。
?...
List lowerNumbers = [1, 2, 3, 4, 5]; List upperNumbers = [6, 7, 8, 9, 10];
この時、
[…lowerNumbers…upperNumbers]==[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
が成り立ちます。
この...をspread operatorといい、collectionリテラル(リストやマップなど)の中でspread operatorを使うとcollectionリテラルの中身を展開し、挿入します。
?...を使うと、対象がnullでないときにのみ挿入を行います。
つまり、
List lowerNumbers = [1, 2, 3, 4, 5]; List upperNumbers = [6, 7, 8, 9, 10]; List numbers = […lowerNumbers?…upperNumbers];
と
List numbers = []; numbers.addAll(lowerNumbers); if(upperNumbers != null){ numbers.addAll(upperNumbers); }
は等しいです。
if (database == null) { database = openDatabase( join(await getDatabasesPath(), 'track_data.db'), ); }
と書くよりも
database = openDatabase(join(await getDatabasesPath(), 'track_data.db'),);
と書く方がいいという話でした。