使用 Spring IoC 设置枚举值

2022-09-01 08:46:28

有没有办法在施工时通过Spring IoC设置这样的枚举值?

我想做的是在类加载时注入在下面的代码片段中硬编码的值:

public enum Car
{
        NANO ("Very Cheap", "India"),
        MERCEDES ("Expensive", "Germany"),
        FERRARI ("Very Expensive", "Italy");

        public final String cost;
        public final String madeIn;

        Car(String cost, String madeIn)
        {
                this.cost= cost;
                this.madeIn= madeIn;
        }

}

假设该应用程序必须部署在德国,那里的Nanos“几乎免费”,或者在印度,法拉利“负担不起”。在这两个国家,只有三辆汽车(确定性集合),不多不少,因此是枚举,但它们的“内在”值可能不同。因此,这是不可变项的上下文初始化的一个案例。


答案 1

您的意思是设置自己吗?enum

我认为这是不可能的。您无法实例化枚举,因为它们具有性质。所以我认为Spring IoC也不能创造staticenums

另一方面,如果您需要设置初始化某些内容,请查看Spring IoC章节。(搜索枚举)您可以使用一个简单的示例。enum


答案 2

我不认为这可以从Spring的配置中完成。但是,你真的需要Spring来完成它,还是你可以使用ResourceBundle进行简单的外部化?喜欢这个:ApplicationContext

public enum Car
{
    NANO,
    MERCEDES,
    FERRARI;

    public final String cost;
    public final String madeIn;

    Car()
    {
            this.cost = BUNDLE.getString("Car." + name() + ".cost");
            this.madeIn = BUNDLE.getString("Car." + name() + ".madeIn");
    }

    private static final ResourceBundle BUNDLE = ResourceBundle.getBundle(...);

}

在属性文件中,每个特定区域设置一个,输入描述可能的内部枚举值的键:

Car.NANO.cost=Very cheap
Car.NANO.madeIn=India
Car.MERCEDES.cost=Expensive
...

这种方法的唯一缺点是必须将 Java 代码中枚举字段(cost,madeIn)的名称作为字符串重复。编辑:从好的方面来说,您可以将所有枚举的所有属性堆叠到每个语言/区域设置的一个属性文件中。