我使用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的最大孩子年龄可配置和注射?
答案 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;
}