gpt4 book ai didi

java - 如何将属性值注入(inject)枚举?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:41 25 4
gpt4 key购买 nike

我正在使用 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)最大子年龄?

最佳答案

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

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

在您的示例中,可能是不同的国家/地区对被视为成人的人有不同的阈值,或者阈值发生变化,然后可能是一个小型服务来确定 PersonTypePerson 有才是正确的方法。

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com