>我有具有静态块的类,如下所示:
public class DataProvider {
static int a;
static String b;
static {
a = readRollConfiguration();
b = readNameConfiguration();
}
public static int getRoll() {
return a;
}
}
我更改了此类的配置和调用方法,然后我获得了a和b的旧值,直到应用程序被杀死并重新启动。
那么有没有办法调用静态块以便更新a和b?
a
和b
只加载一次。如果要在每次调用方法时readRollConfiguration
调用方法并readNameConfiguration
getRoll
,则必须在那里调用该方法。
public class DataProvider {
public static int getRoll() {
return readRollConfiguration();
}
}
您可以使用 Class.forName("com.the.ClassName"); 调用静态块而不引用该类的任何实例。
您正在使用static
初始值设定项块初始化静态变量的值a
和b
作为类初始化的一部分DataProvider
这些值将相同,除非您再次更改static
值。
因此,请更新您的DataProvider
类并添加reloadRollConfig()
和reloadNameConfig()
,如下所示,以便从配置中再次重新加载值:
public class DataProvider {
static int a;
static String b;
static {
a = readRollConfiguration();
b = readNameConfiguration();
}
public static int getRollConfig() {//no reload, gets the current value
return a;
}
public static int getNameConfig() {//no reload, gets the current value
return b;
}
public static int reloadAndGetRollConfig() {//reload and get the new value
a = readRollConfiguration();
return a;
}
public static int reloadAndGetNameConfig() {//reload and get the new value
b = readNameConfiguration();
return b;
}
}
是的,我知道它的坏主意,但配置更改并不经常。
我强烈建议您定期重新加载a
和b
的值,以将最新值设置为DataProvider
类。您可以使用简单的调度程序或使用 Ehcache 等框架实现缓存层来执行此操作。缓存框架提供了许多用于缓存静态数据的功能,我建议您需要考虑为此类配置数据(即不经常更改的数据)实现缓存。
你不能调用静态块。它在创建类对象时调用。您可以将其视为描述类的类对象的构造函数。与创建实例时调用的构造函数不同。
你的做法是完全错误的。 静态块只会在加载类时运行一次。
public class DataProvider {
static int a;
static String b;
static {
a = getSum();
b = "15";
}
public static int getSum(){
return 5 + 6;
}
public static int getRoll() {
return a;
}
}
因此,在这段代码中,每当加载类时,都会创建变量a
并11
DataProvider
值。而且,关键是这个值将是相同的,除非DataProvider
类不会被重新编译或重新加载。甚至,如果getSum()
每次都返回新值,变量a
将仅包含第一个值。
因此,如果您希望a
是动态的,则每次要访问a
时都有更新变量,如下所示:
public static int get_a() {
return a = getSum();
}