如何将属性值注入枚举?

时间:2014-07-04 09:38:21

标签: java spring enums

我使用Spring解析属性文件中的属性值,通常使用@Value("${my.property}")

现在我有一个应该具有应用程序范围的可配置静态编号的枚举。例如:

public enum PersonType {
    ADULT, CHILD;
    private static final int MAX_CHILD = 17;

    public static PersonType fromAge(int age) {
        return age <= MAX_CHILD ? CHILD : ADULT;
    }
}

如何让Spring的最大孩子年龄可配置和注射?

2 个答案:

答案 0 :(得分:8)

这是一个有趣的问题,如何处理对于类的所有对象都相同的变量,并且在运行时不会更改,同时允许在执行之间配置。由于前两个先决条件规定变量应该是静态的和最终的(例如常量),第三个实际上不适合,这意味着没有很好的方法来实现所有三个(需要反射,或者必须放弃静态约束或最终约束。)

由于现在对事物的建模方式没有很好的解决方案,我认为最明智的做法是退后一步并重新考虑变量的位置:是否有必要将此逻辑保留在枚举本身中?更改常量,枚举本身或其他内容的值有什么不同?在什么情况下,这个常数必须改变它的价值?

在您的示例中,可能是不同的国家/地区对于被视为成人的阈值具有不同的阈值,或阈值发生变化,那么可能是确定PersonType Person @Service public class PersonTypeService { @Value("${threshold.for.adulthood}") private int thresholdForAdulthood; public PersonType determinePersonType(final Person person) { if (person.getAge() >= thresholdForAdulthood) { return PersonType.ADULT; } return PersonType.CHILD; } } 所具有的小型服务的小型服务正确的方法。

{{1}}

一般来说,我喜欢让enums只回答“what”,并将“how”和“why”留给域类和服务。在这个例子中,所有枚举需要知道的是它为一个人提供的值,为什么它应该提供某个值,或者它是如何确定的,不属于枚举。

答案 1 :(得分:0)

根据可配置的年龄移动逻辑以获得适当的枚举可以是解决方案之一

class PersonTypeFinder
{
    private int maxChildAge; // set this from spring
    ....

   public PersonType getPersonType(int age)
   {
     return age <= maxChildAge ? PersonType.CHILD : PersonType.ADULT;
   }
}

enum PersonType 
{
   ADULT, CHILD;
}