在注解中使用枚举常数的最后一个字段作为常数。

问题描述 投票:0回答:1

我正在重构旧的代码,想把分散在各处的come常量值列举在某个中心位置,例如,我把所有关于JMS-topic的信息都收集在一个中心位置,就像这样。

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注解。这很好,因为它将代码中定义这些常量的地方从很多减少到只有两个--枚举常量和字符串常量。

我的问题是,如果我们能以某种方式将这两个常量减少到一个。

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

java enums annotations
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.