Java 接口内部的AndroidX StringDef值
我目前正在用androidx的StringDef替换一些枚举,查看文档时,我注意到它们是这样使用的:Java 接口内部的AndroidX StringDef值,java,android,androidx,Java,Android,Androidx,我目前正在用androidx的StringDef替换一些枚举,查看文档时,我注意到它们是这样使用的: @Retention(SOURCE) @StringDef({ POWER_SERVICE, WINDOW_SERVICE, LAYOUT_INFLATER_SERVICE }) public @interface ServiceName {} public static final String POWER_SERVICE = "po
@Retention(SOURCE)
@StringDef({
POWER_SERVICE,
WINDOW_SERVICE,
LAYOUT_INFLATER_SERVICE
})
public @interface ServiceName {}
public static final String POWER_SERVICE = "power";
public static final String WINDOW_SERVICE = "window";
public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
@Retention(SOURCE)
@StringDef({
ServiceName.POWER_SERVICE,
ServiceName.WINDOW_SERVICE,
ServiceName.LAYOUT_INFLATER_SERVICE
})
public @interface ServiceName {
String POWER_SERVICE = "power";
String WINDOW_SERVICE = "window";
String LAYOUT_INFLATER_SERVICE = "layout_inflater";
}
在我目前的情况下,我想在父类中声明多个StringDef。为了结构和代码的整洁,在@interface中声明值而不是像这样在外部声明值会有任何缺点:
@Retention(SOURCE)
@StringDef({
POWER_SERVICE,
WINDOW_SERVICE,
LAYOUT_INFLATER_SERVICE
})
public @interface ServiceName {}
public static final String POWER_SERVICE = "power";
public static final String WINDOW_SERVICE = "window";
public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
@Retention(SOURCE)
@StringDef({
ServiceName.POWER_SERVICE,
ServiceName.WINDOW_SERVICE,
ServiceName.LAYOUT_INFLATER_SERVICE
})
public @interface ServiceName {
String POWER_SERVICE = "power";
String WINDOW_SERVICE = "window";
String LAYOUT_INFLATER_SERVICE = "layout_inflater";
}
这样做有什么坏处吗?其他Android开发人员会不赞成这一点吗?还是这只是一个偏好问题?根据我的经验,StringDef/IntDef的整个概念通常是不赞成的。IntDef总是合理的,因为INT是原语,它们使用的字节更少。。。然而,这对我来说仍然是过早的优化。但是字符串会导致与枚举完全相同的内存使用率,所以为什么您要这样做,特别是因为您已经获得了枚举?我完全同意,实际上,我也不是StringDef的粉丝,我需要将参数传递给特定函数,以避免其他开发人员传递我使用的枚举不支持的值。该值通常是一个字符串,因此在声明枚举值时,我重写了它们的toString函数。当从一个枚举转到另一个枚举时,这工作正常,但当从一个字符串转到另一个枚举时,我使用了一个自定义映射器函数。但在我看来,这样做就像是重新发明轮子。StringDef在不需要枚举字符串映射的情况下执行相同的操作,同时限制可以传递的值