加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:42:28 所属栏目:Java 来源:网络整理
导读:我在 java中有一个类,它有许多静态最终字符串和一个静态Locale变量. 这些字符串基本上是一个messagebundle的键,它使用语言环境返回翻译的字符串. 即, public static Locale locale = Locale.getDefault();public static String MSG1 = Translator.get(locale
我在 java中有一个类,它有许多静态最终字符串和一个静态Locale变量.

这些字符串基本上是一个messagebundle的键,它使用语言环境返回翻译的字符串.

即,

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

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

每次更改localevariable时,有没有办法“重新加载”这些字符串?

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

解决方法

是.虽然您无法让Java再次运行分配,但您可以将分配移动到方法中:

public static String MSG1;

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

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

之后,您可以使用方法setLocale()来切换区域设置.第一次加载类时,最后使用静态初始化程序块设置语言环境.

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

如果您在Web服务器中需要它,那么您就不能再使用静态变量了.我建议创建一个类的实例,并将所有静态字段转换为方法.然后,您可以在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...
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读