假设我有类似以下的课程
public class Foo
{
public static final String FIELD_1 = Env.getProperties("one");
public static final String FIELD_2 = Env.getProperties("one");
//....
public static final String FIELD_N = Env.getProperties("n");
}
显然,当我们第一次引用FIELD_*
时,所有Foo
都会被填充。
假设我的Env.getProperties(String)
不是纯函数(即,它可以返回不同的值。如何?这里不重要)
如何强制类Foo
被“重新加载”,以便重新执行所有类初始化代码(这样我可以为静态字段设置不同的值)?
(由于各种原因,我无法将这些字段设为非静态或非最终字段。 因此,请不要建议像make Foo这样的解决方案,并使用各种getter方法覆盖
由于
答案 0 :(得分:1)
不要这样做!
您可以使用自定义类加载器或JRebel来完成它,但它将是一个巨大的bodge。不同的类可能从这些字段中读取了不同的值,并且彼此不同步等。
常量应该是常数。按照principle of least astonishment进行重构,以获得更好的设计。
最小重构建议
如果字段名称相当合适 - FIELD_1
,FIELD_2
等 - 您可以使用FIELD_1()
,FIELD_2()
来搜索并替换所有Java文件中对它们的引用。 {1}}。然后编写一些代码来用静态方法替换常量:
public static String FIELD_1() { return Env.getProperties("one"); }
public static String FIELD_2() { return Env.getProperties("two"); }
//etc.
它有点难看,但它会让你在不想诉诸真正黑客的情况下成为你想去的地方。