[英]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.