支持注释@StringDef,@ IntDef声明标准?

时间:2016-04-11 16:09:29

标签: android android-studio annotations android-support-library

@StringDef,@ IntDef等使生活变得简单,是使用枚举的好选择。 通常我们看到这些定义如下:

@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {}

public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;
....

如果要在注释本身内部定义这些内容,是否会出现任何问题。例如:

@IntDef({NavigationMode.NAVIGATION_MODE_STANDARD, NavigationMode.NAVIGATION_MODE_LIST, NavigationMode.NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {
  int NAVIGATION_MODE_STANDARD = 0;
  int NAVIGATION_MODE_LIST = 1;
  int NAVIGATION_MODE_TABS = 2;
}
....

当这些def注释被单独定义以便可以跨模块使用时,这很方便。

1 个答案:

答案 0 :(得分:1)

我正在使用Set-AzureVMPuppetExtension : Cannot bind parameter 'VM'. Cannot convert the "$VM" value of type "System.String" to type "Microsoft.WindowsAzure.Commands.ServiceManagement.Model.IPersistentVM". 出了名。它非常棒,特别是因为Android Studio 2.0可以正确使用此注释和@IntDef语句。

我通常使用这种模式:

switch

然后我可以通过public static final class NavigationMode { @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) @Retention(RetentionPolicy.SOURCE) public @interface Value { } public static final int NAVIGATION_MODE_STANDARD = 0; public static final int NAVIGATION_MODE_LIST = 1; public static final int NAVIGATION_MODE_TABS = 2; // Suppress default constructor for noninstantiability private NavigationMode() { throw new AssertionError(); } } 引用该值,注释为NavigationMode.NAVIGATION_MODE_STANDARD,并且有一个更简单的@NavigationMode.Value定义(没有@IntDef前缀)。

但我必须说......我非常喜欢你的第二种方法!

NavigationMode.

我甚至可以切换到它。虽然我不是Android Studio为其着色的方式的忠实粉丝:

我认为以这种方式定义的值不会出现任何问题。