簡體   English   中英

java - 在構造函數中使用反射設置最終字段

[英]java - Set final fields with reflection in Constructor

我正在嘗試制作一個多語言應用程序,其中包含多個*.properties文件中的消息。 我已經開始研究這樣的事情:


    public Language(@NotNull Map<String, String> info) {
        Validate.notNull(info, "Language information cannot be null");

        this.PLUGIN_PREFIX = info.get("PLUGIN_PREFIX");
        this.ARGUMENT_CODE = info.get("ARGUMENT_CODE");
        // etc...
    }

現在,有很多消息,而且我不想每次都輸入相同的內容(而且我可能會出現拼寫錯誤……)。

我想到的第一個解決方案是遍歷所有類似的字段(大寫,最終,非靜態等),然后使用反射將字段名稱用作鍵來將其設置為值。 顯然編譯器不會讓我這樣做,因為它認為 final 字段還沒有被初始化。

像這樣的東西:

    public Language(@NotNull Map<String, String> info) {
        Validate.notNull(info, "Language information cannot be null");

        Field[] fields = /* TODO get fields */ new Field[0];
        
        for (Field f : fields) f.set(f.getName(), info.get(f.getName()));
    }

有沒有辦法可以工作? 還是有更好的解決方案?

編輯:快速命名約定問題,這些最終的“常量”是否應該大寫?

通常,您不會將文本消息直接存儲在常量中,而只是存儲消息鍵。 然后,您使用這些鍵來獲取地圖中的實際文本消息。

您可以直接使用地圖,但在 Java 中,有 ResourceBundle。 ResourceBundle 可以直接從 .properties 文件加載。

我的-bundle_en.properties:

my.message=Hello, world!

my-bundle_fr.properties:

    my.message=Bonjour tout le monde!
    
    my-bundle_de.properties:
    
    my.message=Hallo Welt!
    
    

東西.java:

public static final MY_MESSAGE = "my.message";
    
ResourceBundle bundle = ResourceBundle.getBundle("my-bundle");
String text = bundle.getMessage(MY_MESSAGE);
    System.out.println(text);
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM