如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。
通常我们会在项目中写很多常量,供整个系统使用,一般来说,我们写在一个interface或者final class里面,然后在里面定义一些final static常量。一般的小系统,这样的常量不会太多,我们简单地写在类里面就可以了。但是在大项目中,第一可能会有很多的常量,第二常量的修改可能不是程序员干的,而是系统策划或者需求分析的人做的,他们可能不懂怎么写java类,这时候再让程序员把他们写的东西重新写一遍到系统中就会非常麻烦。
所以我们还是需要配置文件properties的帮忙,其实换成其他文件也可以,不过稍微麻烦一点,配置文件可能更简单一点。
我想过两种方法,一种写一个插件,读取配置文件的内容然后重新生成一个新的Java类,缺点是比较麻烦,每次都要刷新后重新编译。
还有一种就是想办法让定义常量类的数据直接从配置文件中获取。这个稍微有点麻烦,首先interface不支持写构造函数或者静态块。那么只能写一个普通类来完成。可以在前面加上final修饰词来修饰这个类,但是静态变量就不能加final了。而且应该不添加值,等待static块来给它加载。具体写法如下:
public final class Consts {
// 冷却时间毫秒计时
public static int ENHANCE_COOL; // 1分钟
public static int SKILL_COOL; // 1小时
public static int PLANT_COOL; // 8小时
static {
System.out.println("static块加载数据");
Properties property = new Properties();
try {
property.load(new FileInputStream(Declarations.SOURCE_PATH));
ENHANCE_COOL = Integer.parseInt(property.getProperty("ENHANCE_COOL").trim());
SKILL_COOL = Integer.parseInt(property.getProperty("SKILL_COOL").trim());
PLANT_COOL = Integer.parseInt(property.getProperty("PLANT_COOL").trim());
} catch (IOException e) {
e.printStackTrace();
}
}
}