設定のスコープ

EclipseのプラグインのPreference(設定)はワークスペースごとにしか設定できないようなので、不便だなと思っていたんです。でも実はそうじゃなかったんですね。

Preferenceにはスコープがある

AbstractUIPlugin#getPreferenceStore()のソースを見てみると3.4M5ではこんな風に書かれています。

  public IPreferenceStore getPreferenceStore() {
    // Create the preference store lazily.
    if (preferenceStore == null) {
      preferenceStore = new ScopedPreferenceStore(new InstanceScope(),getBundle().getSymbolicName());
    }
    return preferenceStore;
  }

ScopedPreferenceStoreクラスがどうも設定をスコープ化して保存しておくためのPreferenceStoreクラスっぽいです。その引数にInstanceScopeクラスとgetBundle().getSymbolicName()、プラグイン名を取得しています。つまり、Instance ScopeでPreferenceStoreクラスを作成しているっていうことです。何も考えずに設定ページを作るとこのメソッドを使っていることが多いのではないでしょうか。このInstanceScopeクラスを覗いてみると

Instance preferences are stored on a per instance basis in the platform's instance area as specified by the Location class and the Location.INSTANCE_FILTER filter.

JavaDocに書かれています。instance areaというのが、ワークスペースの事なので、ワークスペースごとに保存するスコープだよと言うのが読み取れます。で、このInstanceScopeクラスはAbstractScopeクラスを継承しているので、もしかすると兄弟クラスがいるのではないかと思って調べてみると、他にも次のクラスがあることが分かりました。

  • DefaultScopeクラス
  • ConfigurationScopeクラス

全然知らなかったんですが、こんな感じにPreferenceには大きく分けて3つのスコープがありました。DefaultScopeはメモリ上に保持するスコープで、保存は行われないスコープです。Preferenceにデフォルト値を設定するためのスコープで、RCPなど他のProductとして使用するときに変更できないようにするために使います。ConfigurationScopeクラスはEclipseのconfiguration area(Eclipseのインストールフォルダ/configuration以下)に設定値を保存するスコープです。ワークスペースごとじゃなく、利用するEclipseで同じ設定を使いたい場合に使用するスコープです。

eclipse Rich Client Platformを最近読み返しています。こういう分厚い本は頭から読んでいくといつも負けるので、飛び飛び読んでいました。だから知らなかったこととかが結構あってビビっています。2005年かかれた本ですが、Eclipse 3以降の基盤部分についてはそれほど大きな変更は行われていないので、結構通用する部分が多いです。今日のこのスコープも読み返しているうちに気づいたものでした。

Eclipse Rich Client Platform: Designing, Coding, and Packaging Java™ Applications (Eclipse Series)

Eclipse Rich Client Platform: Designing, Coding, and Packaging Java™ Applications (Eclipse Series)

話は変わりますが、DefaultScopeでググってみるとTeedaが引っかかったんですが、Teedaはアノーテーションでごにょごにょできる機能があるんですね。これって設定に関するのデザインパターンなんでしょうか。