我对andriod @IntDef
注释有疑问。我知道
在其基本用法中,它应该替换enum
。但是如果
我有一个带有多个硬连线值的参数化枚举,例如
public enum MyEnum {
YES(true, 1),
NO(false, 0);
private boolean boolState;
private boolean intState;
MyEnum(boolean boolState, int intState) {
this.boolState = boolState;
this.intState = intState;
}
public boolean getBoolState() {
return boolState;
}
public int getIntState() {
return intState;
}
}
如何将其替换为Android中的枚举注释?
在这种情况下是否甚至暗示做类似的事情?我搜索了 无处不在,但我没有找到任何答案。
提前谢谢!
答案 0 :(得分:7)
我认为你无法找到任何东西,因为:
IntDef是一种替换整数枚举的方法,其中包含参数 应该只接受显式的int值。
您可以阅读更多相关信息here。枚举注释适用于简单类型,您也可以将它用于字符串StringDef
。需要其功能时使用枚举。不要严格避免它。对于你的情况,我认为创建类而不是枚举将如下所示:
public class MyEnum {
public static final MyEnum YES = new MyEnum(true, 1);
public static final MyEnum NO = new MyEnum(false, 0);
private boolean boolState;
private int intState;
MyEnum(boolean boolState, int intState) {
this.boolState = boolState;
this.intState = intState;
}
public boolean getBoolState() {
return boolState;
}
public int getIntState() {
return intState;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyEnum myEnum = (MyEnum) o;
return boolState == myEnum.boolState && intState == myEnum.intState;
}
}
您可以在代码中使用常量。但是如果使用枚举,你将进行类型检查(你只能接受列出的值)和方法重载(每个枚举常量可以有自己的方法实现)< / em>的。如果你想使用更少的空间,这是你想避免使用枚举的唯一原因,我会建议你不值得。
答案 1 :(得分:1)
我遵循Android开发中的枚举规则:
如果有使用枚举的方法,我肯定会考虑它不会破坏代码。
很多是根据Colt Mcanlis发布的视频制作的:https://www.youtube.com/watch?v=Hzs6OBcvNQE&feature=youtu.be
然而,正如杰克沃顿指出的那样,它有一些相当不稳定的数字:https://plus.google.com/+JakeWharton/posts/bTtjuFia5wm枚举的主要缺点是它们使用的内存多于常量,但如果枚举有助于更好的代码,我说使用它而不是微优化。只是不要过度使用它们并注意它们的足迹。
答案 2 :(得分:0)
我迟到了,但无论如何,因为intdef注入了注释,你可以使用自定义类创建注释,然后以相同的方式使用它。鉴于注释需要基元,您必须将接口作为注释类类型传递,并使用子类作为值数组。
示例:
public interface GenericContainer<T, X> {
public T getValueOne();
public X getValueTwo();
}
然后是true / 1
的实现public class TrueContainer implements GenericContainer<Boolean, Integer> {
@Override
public Boolean getValueOne() {
return true;
}
@Override
public Integer getValueTwo() {
return 1;
}
}
和其他用于false / 0
public class FalseContainer implements GenericContainer<Boolean, Integer> {
@Override
public Boolean getValueOne() {
return false;
}
@Override
public Integer getValueTwo() {
return 0;
}
}
最后,使用它们:
@Retention(RetentionPolicy.SOURCE)
@GenericDef({TrueContainer.class, FalseContainer.class})
public @interface genericTest{}
boolean test = isTest(new FalseContainer());