是否可以从Java中的配置文件初始化静态最终变量?

是否可以从Java中的配置文件初始化静态最终变量?,java,configuration,constants,final,Java,Configuration,Constants,Final,我想用Java从配置文件中初始化一个静态final变量。变量如下所示: public static final String SCHEMA = "my_schema"; 由于模式可以更改,我想从配置文件中读取它。然而,我必须使用最后一个变量,因为在JPA中没有其他方法可以将“Table”注释中的“schema”属性日化。关键是,由于过去的选择,每个环境都位于同一个数据库中,具有不同的模式名称。UPD-为了更好的解决方案而进行了编辑 我能想到的唯一解决办法是在带有最终变量的行之前有另一个非最终私

我想用Java从配置文件中初始化一个静态final变量。变量如下所示:

public static final String SCHEMA = "my_schema";

由于模式可以更改,我想从配置文件中读取它。然而,我必须使用最后一个变量,因为在JPA中没有其他方法可以将“Table”注释中的“schema”属性日化。关键是,由于过去的选择,每个环境都位于同一个数据库中,具有不同的模式名称。

UPD-为了更好的解决方案而进行了编辑

我能想到的唯一解决办法是在带有最终变量的行之前有另一个非最终私有字符串变量和一个静态init块。例如,以下代码将在初始化后生成不同的最终变量

public class TestSmth {

    private static String yourCustomSchema;
    static {
       yourCustomSchema = Math.random() > 0.5 ? "my_schema" : "another_schema";
     }

    public static final String SCHEMA = yourCustomSchema;


    public static void main(String[] args) {
        System.out.println(SCHEMA);
    }
}
您应该在静态块中实现配置文件加载


这样,在类加载之后,您就可以初始化最终变量,并且无法访问非最终私有变量

为什么模式会改变?与环境有关,您是说您的开发环境和产品环境在不同的模式中,而不是在不同的数据库中?通常架构不会更改,就像表名和列名不会更改一样。@Kayaman,很遗憾,是的,我的意思是开发环境和产品环境在不同的架构中。不是我的选择。好吧,那很糟糕,不,这是不可能的。最终变量是编译时的东西,即使通过反射修改了值,也不会影响注释。