我在库中的一些方法中使用
@Retention
和 @StringDef
注释,我面临一个奇怪的警告,我想理解。
在静态类中,
SIP
,我使用这个注释:
public static final String CODEC_SPEEX_16K = "speex/16000/1";
public static final String CODEC_SPEEX_8K = "speex/8000/1";
public static final String CODEC_SPEEX_32K = "speex/32000/1";
public static final String CODEC_ILBC_8K = "iLBC/8000/1";
public static final String CODEC_GSM_8K = "GSM/8000/1";
public static final String CODEC_PCMU_8K = "PCMU/8000/1";
public static final String CODEC_PCMA_8K = "PCMA/8000/1";
public static final String CODEC_G722_16K = "G722/16000/1";
@Retention(RetentionPolicy.CLASS)
@StringDef({
CODEC_SPEEX_16K,
CODEC_SPEEX_8K,
CODEC_SPEEX_32K,
CODEC_ILBC_8K,
CODEC_GSM_8K,
CODEC_PCMU_8K,
CODEC_PCMA_8K,
CODEC_G722_16K
})
public @interface CodecName {}
编译良好,没有任何警告。
在静态类中
Tools
我使用这个注释:
public static final String RES_TYPE_STRING = "string";
public static final String RES_TYPE_DRAWABLE = "drawable";
public static final String RES_TYPE_LAYOUT = "layout";
public static final String RES_TYPE_VIEW = "id";
public static final String RES_TYPE_DIMEN = "dimen";
public static final String RES_TYPE_COLOR = "color";
public static final String RES_TYPE_ANIM = "anim";
public static final String RES_TYPE_MIPMAP = "mipmap";
@Retention(RetentionPolicy.CLASS)
@StringDef({
RES_TYPE_STRING,
RES_TYPE_DRAWABLE,
RES_TYPE_LAYOUT,
RES_TYPE_DIMEN,
RES_TYPE_COLOR,
RES_TYPE_ANIM,
RES_TYPE_VIEW,
RES_TYPE_MIPMAP
})
public @interface ResourceType {
}
我收到警告:
typedef 注释 ....toolbox.Tools.ResourceType 应该有 @Retention(RetentionPolicy.SOURCE)
看起来不挑剔,一切正常。 但有人可以解释一下为什么吗
Annotation#1 没有收到警告;
Annotation#2 收到警告;
两者构建相同,都仅在静态上下文中使用。从我的角度来看,两者是相同的。
注释-01
在 Annotation-01 (CodecName):保留策略是 RetentionPolicy.CLASS,这意味着注释保留在已编译的类文件中并且可以在运行时通过反射读取。
由于 @StringDef 用于编译时验证而不是运行时检查,因此在那里使用 RetentionPolicy.CLASS 是合适的。该注释不用于运行时反射,而是用于编译时类型检查。
注释-02
现在,同时在 Annotation-02 (ResourceType): Retention Policy 为 RetentionPolicy.SOURCE,表示该 annotation 仅保留在源代码中,并在生成类文件之前被编译器丢弃 。 因为,对于 @StringDef 注释,通常建议使用 RetentionPolicy.SOURCE,因为 注释主要用于编译时检查, 并且不需要保留在字节码中或在运行时使用。
.
结论是 警告建议将 ResourceType 更改为 RetentionPolicy.SOURCE,因为 @StringDef 注释是为了编译时安全。因此,RetentionPolicy.SOURCE 将更适合您的用例,以避免不必要地包含在类文件中.
我希望我的回答能够解决您的疑问,如果是(也有一点),请为我的答案点赞。