クラス定数を用意するのに多少の処理が必要な時がある。Java だと Static Initialization Blocks (静的初期化ブロック)と言われてるやつ。
問題
例えば、クラス定数(静的フィールド)の Map
の初期化をするとき、Java だとこう書く:
Foo.java
// Java のコードだよ
public class Foo {
final static Map<String, String> MAP = new HashMap<>();
static {
// マップの初期化
MAP.put(...);
...
}
...
}
しかし、Dart にはこの static { ... }
がない。
案1: プライベートなクラスメソッド(関数)を作る
Java チュートリアルでも同じ指摘してる んですが、static { ... }
使わないで、プライベートなクラスメソッド作ればいいのでは、という話:
foo.dart
class Foo {
static final map = _initMap();
static Map<String, String> _initMap() {
final m = new Map();
// マップの初期化
m[...] = ...;
...
return m;
}
...
}
案2: 即時実行関数をつかう
JavaScript でいうところの (function(){...})()
を使う:
foo.dart
class Foo {
static final Map<String, String> map = () {
final m = new Map();
// マップの初期化
m[...] = ...;
...
return m;
}();
...
}
案1 と違い、例示した map
に型の宣言を明示的に行わないと、Type Propagation? が働いてくれず、dynamic
のままになってしまうので注意です。
個人的には MAP
の型を明示的に指定するより、匿名関数の返り値の型を指定したいんだけど、そんな仕様ないっぽいですかね。