java - 在注释中使用枚举常量的最终字段作为常量
问题描述
我正在重构旧代码,并希望枚举散布在某个中心位置的所有常量值,例如,我已经在一个中心位置收集了有关我们 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 注释。这很好,因为它将代码中定义此类常量的位置从很多减少到只有两个 - 枚举常量和字符串常量。
我的问题是,如果我们能以某种方式从两个一直到一个。
(是的,当然我可以将字符串常量移动到枚举类本身,但这在我看来并不是一个真正的解决方案。它仍然是定义同一事物的某些方面的两个地方)
解决方案
推荐阅读
- neural-network - 如何从 keras NN 获取可能性数据?
- python - 将 Python gui 窗口放在前面?
- vb.net - 如何在 VB.net 中显示 .txt 文件的内容并进行比较
- php - 尝试呈现内容时出现白页
- haskell - 使用 postgresql-simple 查询字符串的类型错误
- asp.net-mvc - Azure Active Directory 身份验证问题
- angular - 位置 437 的 JSON 中的意外标记 }
- python - 比较列表python列表的元素
- sql - 查找重叠的日期范围并从事实表中删除重复项
- ballerina - 如何在 Ballerina 中丰富 JSON 数组