リソースファイルからインジェクトする

Google Guiceならばすぐできるかなと思いちょっとやってみた。
環境設定はModule単位で分割できるのでこれでいいかな。

モジュール定義

public class ResourceModule implements Module{

    private ResourceBundle bundle;

    public ResourceModule(String name) {
        bundle = ResourceBundle.getBundle(name);
    }
    public ResourceModule(String name,Locale locale) {
        bundle = ResourceBundle.getBundle(name,locale);
    }
    
    public void configure(Binder binder) {
        for(Enumeration<String> keys = bundle.getKeys();keys.hasMoreElements();){
            String key = keys.nextElement();
            binder.bind(String.class).annotatedWith(Names.named(key)).toInstance(bundle.getString(key));
        }
    }

}


実行&DIされるクラス

public class Main {

    @Inject
    @Named("message")
    private String message;
            
    public void print(String name){
        System.out.println(message + name );
    }
    
    public static void main(String[] args) {

        Module module = new ResourceModule("hoge");
//        Module module = new ResourceModule("hoge",Locale.ENGLISH);
        Injector injector = Guice.createInjector(module);
        
        Main main = injector.getInstance(Main.class);
        
        main.print("名無しさん");
    }

}

プロバイダを使って動的に毎回取得するほうと最初にまとめて登録するのとどっちがいいか考えた結果、起動時にすべて登録するようにした。環境によってはプロバイダを使ったほうがいいかもしれない。

ちなみにNetBeansのリソースファイルはよくできていて、プロパティファイルが特定の書式で複数生成されるということをまったく知る必要がない。というか、知る術がない。せめてファイルビューの場合はそのまま表示してほしかったかな。もちろん、native2asciiの存在も知らなくてよい。すばらしい。


右クリックでロケールもすぐ追加可能だ。


入力する場合、ロケールごとにすぐ確認できる。

もちろん、1つのロケールだけを普通にエディタモードで開くこともできる。