10

我正在编写使用Jackson进行 JSON 序列化的 Java 代码。我必须在我的类之前使用的一个注释是@JsonTypeName(/*Insert string here*/),以便为此类的对象提供唯一的序列化标识符。在我当前的代码中,我们使用另一个类的全局常量来设置 String 参数。例子:

public class AnnotationValues {
    private static final String id1 = "1";
    private static final String id2 = "2";
    private static final String id3 = "3";
    // And so on...
}

使用这个类,我们的注解看起来像@JsonTypeName(AnnotationValues.id1). 我个人不认为这是一种非常健壮的编码风格,使用一类全局字符串常量。一旦我的应用程序需要处理大量 JSON 消息并因此需要许多不同的标识符,这将变得很烦人。一般来说,我自然会通过使用enum. 我会将课程替换为:

public enum AnnotationValues {
    ID1("1"),
    STATS_RESPONSE("2"),
    SESSION_RESPONSE("3"),
    /* Add more... */;
    public final String value;
    private AnnotationValues(String value) {
        this.value = value;
    }
}

使用这个枚举,我想写@JsonTypeName(AnnotationsValues.ID1.value)作为我的注释。但这不起作用。我收到此错误消息:“注释属性 JsonTypeName.value 的值必须是常量表达式”。一个简单的 Google/SOF 搜索将我带到这个 SOF 帖子,告诉我为什么这是一个错误;注释参数的字符串值必须是常量。很烦人,我不能使用enum.

还有其他人遇到这个问题吗?此类问题的公认解决方案是什么?我真的应该为我的注释使用一长串字符串常量吗?有什么办法可以使用我的枚举来挽救?还要别的吗?

4

2 回答 2

7

我真的希望我或其他人能给你一个不同的答案,但是不,没有其他更好的方法了。在这种情况下,我们都被一个充满静态最终字符串的类所困。您尝试使其工作的方式应该有效,但事实并非如此。目前,这只是 Java 中的方式。我自己曾经遇到过这个问题,我也很恼火地发现不能将 Enums 视为常量表达式。我感受到你的痛苦,我希望我能给你一个不同的答案。

于 2013-03-19T17:16:49.677 回答
-1

正如另一个答案所建议的那样,不,这对于 Java 注释是不可能的。

但我想问这个:为什么你认为使用 ofEnum会比使用 String 常量更好?对我来说,这些方法看起来很相似,而且为了简单起见,添加 Enum 包装器有什么意义?两种情况下的引用是相似的,实际常量存储在一个集中的地方,这有它的好处,这样你就可以共享相同的字符串。

所以我不太明白“不要认为这是一种非常健壮的编码风格”,或者至少不明白使用额外的无操作枚举包装器将如何改进设计。

于 2015-04-02T06:10:28.903 回答