gpt4 book ai didi

java - 重新加载 java 类中的静态字段

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:55 25 4
gpt4 key购买 nike

我在 java 中有一个类,它有许多静态最终字符串和一个静态 Locale 变量。

这些字符串基本上是消息包的键,它使用语言环境返回翻译后的字符串。

即,

public static Locale locale = Locale.getDefault();
public static String MSG1 = Translator.get(locale, "MSG1");
//Similar Strings.

此语言环境变量是在运行时根据浏览器语言环境设置的。但由于这些是静态变量,它们已经使用默认语言环境进行了初始化,并且对 locale 变量的更改不会产生任何影响。

有没有办法在每次 locale 变量更改时“重新加载”这些字符串?

我不想做明显的改变(使所有字符串都非静态并在构造函数/方法中初始化语言环境)因为这个类有很多消息(250+)并且用在了太多地方。

最佳答案

是的。虽然您不能让 Java 再次运行赋值,但您可以将赋值移到一个方法中:

public static String MSG1;

public static void setLocale(Locale locale) {
MSG1 = Translator.get(locale, "MSG1");
}

static {
setLocale( Locale.getDefault() );
}

之后,您可以使用方法setLocale() 来切换语言环境。第一次加载类时,会在末尾使用静态初始化程序 block 设置语言环境。

[编辑] 这在多线程环境中当然不起作用:静态变量是全局的(= 在所有线程之间共享)。更糟糕的是:由于 Java 的内存模型,线程 1 中变量的更改可能在任何特定时间点对任何其他线程都不可见。

如果您在网络服务器中需要它,那么您就不能再使用静态变量了。我建议创建一个类的实例并将所有静态字段转换为方法。然后你可以在 Filter 中创建这个实例并将其放入请求中并正确配置。

public class I18nHelper {
public static I18nHelper get( HttpServletRequest request ) {
return (HttpServletRequest) request.getAttribute( "I18nHelper" );
}

private Locale locale;

public I18nHelper(Locale locale) {
this.locale = locale;
}

public String msg1() {
return Translator.get(locale, "MSG1");
}
}

这种方法还有另一个巨大的优势:您可以传递类型安全的参数!

    public String fileNotFoundMsg( File file ) {
... format message with parameter "file" and return it...
}

关于java - 重新加载 java 类中的静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com