enumを利用して設定ファイルの記述を簡易化

http://d.hatena.ne.jp/alpha_neet/20101001/1285884675

前回から相変わらずenum弄ってます。なかなか面白いです。


enumはコンストラクタの扱いが特殊なので、一度だけ実行する処理がやりづらいです。
そのときはenumのインナークラスとしてprivate enumのシングルトンを生成してそこでやれば綺麗にかけます。


String path = $.FILE_PATH.$;
$.FILE_PATH.$ = newPath;


こういう記述で設定ファイルを操作できるようにしたコードです。

書いてから思ったんですが今回の場合propertiesファイルの扱いをアダプターパターンか何かよくわかりませんがそういうので別部品化すればよかったなと思いました。

まぁ今回もスクラッチツールを作るときには重宝しそうなコードです。

import java.util.Properties;  
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

enum $ {
  FILE_PATH,
  WINDOW_MAXIMIZED,
  WINDOW_X,
  WINDWO_Y,
  WINDOW_W,
  WINDOW_H,
  ;

  /**
   * config file system
   */
  private enum FILE {
    INSTANCE;

    Properties prop;
    String name;
    void set(String k, String v) { prop.setProperty(k, v); }
    String get(String k) { return prop.getProperty(k); }
    void save(Enum[] values) {
      for(Enum val: values) {
        String v = val.toString();
        if(v!=null) set(val.name(), v);
      }
      try { prop.store(new FileOutputStream(name), null); }
      catch(IOException e) { e.printStackTrace(); }
    }
    FILE() {
      try {
        name = this.getClass().getCanonicalName();
        name = name.replaceAll("\\.","_");
        name = name.replaceAll("\\$", "config");
        name = name.replaceAll(
          "_"+this.getClass().getSimpleName(),
          "\\.properties"
        );
        name = name.toLowerCase();
        File f = new File(name);
        if(!f.exists()) f.createNewFile();
        prop = new Properties();
        prop.load(new FileInputStream(name));
      } catch(IOException e) { e.printStackTrace(); }
    }
  }

  public String $;
  private $() { $ = FILE.INSTANCE.get(this.name()); }
  public String toString() { return $; }
  public static void SAVE() {
    FILE.INSTANCE.save(values());
  }
}

class EnumTest {
  void p(Object o) { System.out.println(o); }
  EnumTest() { 
    String path = $.FILE_PATH.$;
    p(path);
    $.FILE_PATH.$ = "moke";
    p($.FILE_PATH);

    String wx = $.WINDOW_X.$;
    p(wx);
    $.WINDOW_X.$ = "20";
    p($.WINDOW_X);
    $.SAVE();
    
    // 一応カプセル化もできてます
    //p($.FILE.INSTANCE);
  }
  public static void main(String[] args) {
    new EnumTest();
  }
}