如何将属性值注入枚举?

mem*_*und 6 java enums spring

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能让Spring的最大孩子年龄可配置和注射?

Tob*_*obb 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;
    }  
}
Run Code Online (Sandbox Code Playgroud)

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