在 android 中将参数化枚举转换为枚举注解
Convert parametized Enum to Enumerated Annotation in android
我有一个关于 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 中的枚举注释?
在这种情况下,甚至暗示做这样的事情吗?我搜索了
无处不在,但我还没有找到任何答案。
提前致谢!
我认为您找不到任何东西,因为:
IntDef is a way of replacing an integer enum where there's a parameter
that should only accept explicit int values.
您可以阅读更多相关信息 here。枚举注释用于简单类型,您也可以将它用于字符串 StringDef
。当你需要它的特性时使用枚举。不要严格避免它。对于您的情况,我认为创建 class 而不是枚举将如下所示:
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;
}
}
并且您可以在代码中使用常量。但是,如果使用枚举,你将进行类型检查 (你将只能接受列出的值) 和方法重载 (每个枚举常量都可以有自己的实现方法)。如果你想使用 less space 并且这是你想避免使用枚举的唯一原因我建议你这是不值得的。
我在 Android 开发中遵循枚举规则:
- 如果没有参数,使用 intdef/stringdef、
- 如果它有参数,使用枚举
如果有使用枚举的方法,我肯定会考虑它不会破坏代码。
Colt Mccanlis 发布的视频制作了很多内容:https://www.youtube.com/watch?v=Hzs6OBcvNQE&feature=youtu.be
然而,正如杰克·沃顿 (Jake Wharton) 指出的那样,其中有一些相当不稳定的数字:https://plus.google.com/+JakeWharton/posts/bTtjuFia5wm
枚举的主要缺点是它们比常量使用更多的内存,但如果该枚举有助于更好的代码,我会说使用它而不是微优化。只是不要过度使用它们并注意它们的足迹。
我来晚了,但无论如何,由于 intdef 插入了注释,您可以使用自定义 class 创建注释,然后以相同的方式使用它。鉴于注释需要基元这一事实,您必须将接口作为注释 class 类型传递,并使用 subclasses 作为值数组。
示例:
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());
我有一个关于 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 中的枚举注释?
在这种情况下,甚至暗示做这样的事情吗?我搜索了 无处不在,但我还没有找到任何答案。
提前致谢!
我认为您找不到任何东西,因为:
IntDef is a way of replacing an integer enum where there's a parameter that should only accept explicit int values.
您可以阅读更多相关信息 here。枚举注释用于简单类型,您也可以将它用于字符串 StringDef
。当你需要它的特性时使用枚举。不要严格避免它。对于您的情况,我认为创建 class 而不是枚举将如下所示:
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;
}
}
并且您可以在代码中使用常量。但是,如果使用枚举,你将进行类型检查 (你将只能接受列出的值) 和方法重载 (每个枚举常量都可以有自己的实现方法)。如果你想使用 less space 并且这是你想避免使用枚举的唯一原因我建议你这是不值得的。
我在 Android 开发中遵循枚举规则:
- 如果没有参数,使用 intdef/stringdef、
- 如果它有参数,使用枚举
如果有使用枚举的方法,我肯定会考虑它不会破坏代码。
Colt Mccanlis 发布的视频制作了很多内容:https://www.youtube.com/watch?v=Hzs6OBcvNQE&feature=youtu.be
然而,正如杰克·沃顿 (Jake Wharton) 指出的那样,其中有一些相当不稳定的数字:https://plus.google.com/+JakeWharton/posts/bTtjuFia5wm
枚举的主要缺点是它们比常量使用更多的内存,但如果该枚举有助于更好的代码,我会说使用它而不是微优化。只是不要过度使用它们并注意它们的足迹。
我来晚了,但无论如何,由于 intdef 插入了注释,您可以使用自定义 class 创建注释,然后以相同的方式使用它。鉴于注释需要基元这一事实,您必须将接口作为注释 class 类型传递,并使用 subclasses 作为值数组。
示例:
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());