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

标签 java spring enums

我正在使用 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/

相关文章:

java - MySQL last_insert_id() 在正确的事务中返回 0

java - JPA如何延迟加载集合?

C:指向返回枚举的函数的函数指针

C++ 打包 typedef 枚举

java - 对 Java 中的不同类型应用通用逻辑

java - 如何在Java中从IP获取子网

java - 连接到服务器时客户端窗口不会关闭

java - 屏幕 X、Y 坐标转换为 map 经度/纬度坐标

java - JDBC spring 中的 Bad Sql Grammar 异常

javascript - 如何在枚举上创建代理?