我正在使用 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 可以配置和注入(inject)最大子年龄?
最佳答案
这是一个有趣的问题,如何处理对类的所有对象都相同且在运行时不会更改的变量,同时允许在执行之间进行配置。由于前两个先决条件规定变量应该是静态的和最终的(例如常量),第三个真的不适合,这意味着没有很好的方法来实现这三个(需要反射,或者必须删除静态或最终约束)。
由于现在的建模方式没有很好的解决方案,我认为最明智的做法是退后一步,重新考虑变量的放置:是否有必要将此逻辑保留在枚举本身中?更改常量、枚举本身或其他内容的值时有什么不同?在什么情况下这个常量必须改变它的值?
在您的示例中,可能是不同的国家/地区对被视为成人的人有不同的阈值,或者阈值发生变化,然后可能是一个小型服务来确定 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;
}
}
一般来说,我喜欢让枚举只回答“什么”,而将“如何”和“为什么”留给领域类和服务。在这个例子中,枚举只需要知道它为一个人提供的值,为什么它应该提供某个值,或者它是如何确定的,不属于枚举。
关于java - 如何将属性值注入(inject)枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24571202/