Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口内部的AndroidX StringDef值_Java_Android_Androidx - Fatal编程技术网

Java 接口内部的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

我目前正在用androidx的StringDef替换一些枚举,查看文档时,我注意到它们是这样使用的:

  @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在不需要枚举字符串映射的情况下执行相同的操作,同时限制可以传递的值