LoginSignup
4
4

More than 5 years have passed since last update.

静的フィールドの初期化ためブロックが定義できない

Last updated at Posted at 2014-08-22

クラス定数を用意するのに多少の処理が必要な時がある。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 の型を明示的に指定するより、匿名関数の返り値の型を指定したいんだけど、そんな仕様ないっぽいですかね。

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4