【问题标题】:Convert parametized Enum to Enumerated Annotation in android在android中将参数化枚举转换为枚举注释
【发布时间】:2017-02-28 15:32:51
【问题描述】:

我对 andriod @IntDef Annotation 有疑问。我知道 在其基本用法中,它应该替换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 中将其替换为枚举注解?

在这种情况下做这样的事情是否具有暗示性?我搜索过 到处都是,但我还没有找到任何答案。

提前谢谢你!

【问题讨论】:

    标签: java android enums annotations android-support-library


    【解决方案1】:

    我认为你找不到任何东西,因为:

    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;
        }
    
    }
    

    您可以在代码中使用常量。但是如果使用枚举,您将进行类型检查(您将只能接受列出的值)和方法重载(每个枚举常量都可以有自己的方法实现)。如果您想使用更少的空间,这是您想避免使用枚举的唯一原因,我建议您这样做不值得。

    【讨论】:

    • 这不会否定避免枚举的意义吗?据我了解,枚举与类实例具有相似的足迹,这就是内存足迹的来源......
    • 我认为当你需要它的特性时使用枚举是可以的,我们不应该严格避免它。我刚刚在我的回答中提到了类示例,以演示如果您不使用枚举需要创建什么。不过我觉得还是说清楚一点会更好。
    • 很公平,我只是觉得在 Android 中避免枚举的努力并不好,而且往往会导致代码更差(intdef/stringdef 样式枚举除外)。看看使用这样的类 vs 枚举 vs 静态帮助类的开销会很有趣。
    • 这可能是一个很好的例子 here 是 YouTube 上的 android 开发者频道的视频,它解释了应该做什么和如何做。
    • 是的,这是一个很棒的频道,但是在这种情况下,他的一些数字是......误导。请参阅我在 Jake Wharton 的回答中的第二个链接。
    【解决方案2】:

    我在 Android 开发中遵循枚举规则:

    • 如果它没有参数,使用 intdef/stringdef,
    • 如果有参数,使用枚举

    如果有办法使用枚举,我肯定会考虑它不会破坏代码

    很多内容来自 Colt Mcanlis 发布的视频:https://www.youtube.com/watch?v=Hzs6OBcvNQE&feature=youtu.be

    但是正如 Jake Wharton 所指出的,它有一些相当不稳定的数字:https://plus.google.com/+JakeWharton/posts/bTtjuFia5wm

    枚举的主要缺点是它们比常量使用更多的内存,但如果枚举有助于更好的代码,我说使用它而不是微优化。只是不要过度使用它们并注意它们的足迹。

    【讨论】:

      【解决方案3】:

      我来晚了,但无论如何,由于 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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        相关资源
        最近更新 更多