错误:“属性值必须是常量”。我可以在编译时从枚举中构造一个常量吗?

时间:2013-12-10 14:31:40

标签: java enums annotations constants

以下代码可以正常工作,其中PROCESS_UPDATES是常量。

    public static final String PROCESS_UPDATES = "ProcessUpdates";
    public static final String PROCESS_UPDATES = "ProcessSnapshots";
    // etc....

    @Produce(uri = "seda:" + MyClass.PROCESS_UPDATES)
    protected ProducerTemplate processUpdatesTemplate;

然而为了避免整个地方有十亿个常量字符串,我正在尝试枚举设计模式。

    public enum Route { ProcessUpdates, ProcessSnapshots }

在大多数情况下,我可以写"seda:" + Route.ProcessSnapshots,它看起来更整洁。

然而,我可靠的测试代码现在失败了,因为注释中的uri必须是常量。

    @Produce(uri = "seda:" + MyClass.Route.ProcessUpdates)    // compiler error
    protected ProducerTemplate processUpdatesTemplate;

错误:Attribute value must be constant

问题是,Route.ProcessUpdates.toString()种“是”常量,但编译器不会这样看。

我读了about constants and annotations,但我没有看到任何答案。

那么有一种很好的方法可以在java中的编译时从枚举构造一个常量String吗?

感谢您的任何提示。 vikingsteve

2 个答案:

答案 0 :(得分:3)

我没有找到解决方案。

据我所见,这是不可能的。

我需要使用字符串常量... public static final String XYZ = "Xyz"; - 等等。

答案 1 :(得分:0)

“计算机科学中的所有问题都可以通过另一种间接解决方案来解决” --- David Wheeler

这里是:

枚举类:

public enum Gender {
    MALE(Constants.MALE_VALUE), FEMALE(Constants.FEMALE_VALUE);

    Gender(String genderString) {
    }

    public static class Constants {
        public static final String MALE_VALUE = "MALE";
        public static final String FEMALE_VALUE = "FEMALE";
    }
}

人员班:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import static com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id;

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = Person.GENDER)
@JsonSubTypes({
    @JsonSubTypes.Type(value = Woman.class, name = Gender.Constants.FEMALE_VALUE),
    @JsonSubTypes.Type(value = Man.class, name = Gender.Constants.MALE_VALUE)
})
public abstract class Person {
...
}