我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的最大孩子年龄可配置和注射?
这是一个有趣的问题,如何处理对于类的所有对象都相同的变量,并且在运行时不会更改,同时允许在执行之间配置.由于前两个先决条件规定变量应该是静态的和最终的(例如一个常量),第三个实际上不适合,这意味着没有很好的方法可以实现所有三个(需要反射,或者需要反射)放弃静态约束或最终约束).
由于现在对事物的建模方式没有很好的解决方案,我认为最明智的做法是退后一步并重新考虑变量的位置:是否有必要将此逻辑保留在枚举本身中?更改常量,枚举本身或其他内容的值有什么不同?在什么情况下,这个常数必须改变它的价值?
在您的例子,可能是不同的国家有不同的阈值什么被视为成年,或将阈值的变化,那么也许是确定哪些小服务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"留给域类和服务.在该示例中,所有枚举需要知道的是它为人提供的值,为什么它应该提供某个值,或者如何确定它,不属于枚举.
| 归档时间: |
|
| 查看次数: |
3803 次 |
| 最近记录: |