注解类中能否实现构造方法重载?
注解类中能否实现构造方法重载?
嘿,这个问题问得挺实在的!先给你明确答案:不管是Kotlin还是Java,注解类都不支持构造方法重载,你代码里写的那种带枚举参数的构造器写法,编译器直接会报错,走不通的。
看你写的Note注解类代码,还有个小问题——那个重载构造器里的this.comment根本拿不到有效数值,因为你是在调用主构造器的初始化逻辑,此时注解本身还没完成初始化,这种写法本身就不成立。
为啥注解不能搞构造重载呢?其实是注解的设计规则决定的:注解本质是用来做元数据标记的,语法上就被限制只能有一个主构造器,而且构造器的参数类型只能是基本类型、字符串、枚举、其他注解,或者这些类型的数组,根本不允许定义额外的重载构造器。
那想实现你要的「既能直接传字符串参数,又能传枚举实例」的效果,怎么搞呢?给你两个可行的思路:
思路一:利用注解参数的可选性
把注解的主构造器参数都设为可选的,同时支持枚举和字符串参数,比如:enum class Notes(val name: String, val comment: String) { A("A", "comment for A"), B("B", "comment for B") } @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS) annotation class Note( val note: Notes? = null, val name: String = "", val comment: String = "" ) // 使用方式1:自定义字符串 @Note(name = "Foo", comment = "comment for Foo") class Foo() // 使用方式2:传枚举 @Note(note = Notes.B) class Bar()之后在解析注解的时候,判断
note是否为null:如果不为null,就用枚举里的name和comment;如果为null,就用传入的name和comment。思路二:直接复用枚举的常量值
如果你不想改注解的结构,也可以在使用的时候直接传递枚举的属性值,比如:@Note(Notes.A.name, Notes.A.comment) class Bar()这种写法虽然多敲几个字符,但胜在注解结构简单,不用额外处理逻辑。
总之,构造重载这条路在注解类上是走不通的,换个思路就能实现你要的效果啦~
备注:内容来源于stack exchange,提问作者Vik
相关产品推荐
相关产品推荐

