繁体   English   中英

Java无法将枚举用作注释的String参数(例如:Jackson)

[英]Java inability to use enum as a String argument to an annotation (ex: Jackson)

我正在编写使用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) 我个人认为使用一类全局String常量不是非常健壮的编码样式。 一旦我的应用程序需要处理大量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 ,这很烦人。

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

我真的希望我或其他人可以给您不同的答案,但是不,没有其他方法可以更好地工作。 在这种情况下,我们全都只能使用充满静态最终Strings的类。 您尝试使其工作的方式应该有效,但事实并非如此。 目前,这只是Java中的方式。 我一次遇到这个问题,也很生气地发现枚举不能像常量表达式那样对待。 我感到您的痛苦,希望再次给您一个不同的答案。

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

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

因此,我不太理解“不要认为这是一种非常健壮的编码样式”,或者至少不能理解使用额外的无用枚举包装将如何改善设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM