首页 > 解决方案 > 在注释中使用枚举常量的最终字段作为常量

问题描述

我正在重构旧代码,并希望枚举散布在某个中心位置的所有常量值,例如,我已经在一个中心位置收集了有关我们 JMS 主题的所有信息,如下所示:

public enum Topic {
    CAKES("cakes",42),
    FRUITS("fruits_v2",47); // 47 = 42+inflation

    public final String jmsTopicName;
    public final int importantNumber;

    Topic(String jmsTopicName, int number) {
        this.jmsTopicName = jmsTopicName;
        this.importantNumber = number;
    }
}

问题:当我想在注释中使用字段 jmsTopicName 时,如下所示:

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
        @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "NonDurable"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/" + Topic.FRUITS.jmsTopicName)})
public class FruitBasketMDB implements MessageListener {
// do stuff here
}

我不允许这样做,因为(可以理解)编译器看不到 FRUITS.jmsTopicName 实际上是一个常量,而不是 Topic 的构造函数在运行时计算的东西。我已经尝试过像 FRUITS.name() 这样的技巧来说服编译器注释中的值确实是绝对恒定的,但到目前为止还没有被说服。

我现在的解决方法是有一个单独的类,里面装满了字符串常量:

public final class TopicNames{

    private TopicNames(){}

    public static final String CAKES="cakes";
    public static final String FRUITS="fruits_v2";

}

并使用它们来定义枚举常量和 MDB 注释。这很好,因为它将代码中定义此类常量的位置从很多减少到只有两个 - 枚举常量和字符串常量。

我的问题是,如果我们能以某种方式从两个一直到一个。

(是的,当然我可以将字符串常量移动到枚举类本身,但这在我看来并不是一个真正的解决方案。它仍然是定义同一事物的某些方面的两个地方)

标签: javaenumsannotations

解决方案


推荐阅读