12

我想编写一个只为参数取某些值的方法,比如ToastAndroid 类中的 fe。您只能使用Toast.LENGTH_SHORTorToast.LENGTH_LONG作为方法的持续时间makeText(Context context, int resId, int duration)。我查看了Toast该类的源代码,但没有发现任何内容。我怎样才能做到这一点?

4

3 回答 3

42

您可以为您的方法使用@IntDef@StringDef注释,如下所示:

@Retention(SOURCE)
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
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;
...
public abstract void setNavigationMode(@NavigationMode int mode);
@NavigationMode
public abstract int getNavigationMode();
于 2016-05-10T20:43:33.353 回答
8

使用 Java 教程中的Enum Type

枚举类型是一种特殊的数据类型,它使变量能够成为一组预定义的常量。该变量必须等于为其预定义的值之一。常见示例包括指南针方向(NORTH、SOUTH、EAST 和 WEST 的值)和星期几。

举个例子,

public enum MyEnum {
  ONE, TWO;
}

public static void myMethod(MyEnum a) {
  // a must be MyEnum.ONE or MyEnum.TWO (in this example)
}

编辑

要从枚举类型中获取字符串,您可以添加字段级值(必须是编译时常量),例如,

public enum MyEnum {
  ONE("uno"), TWO("dos");
  MyEnum(String v) {
    value = v;
  }
  private String value;
  public String getValue() {
    return value;
  }
}
于 2014-07-12T16:44:15.530 回答
1

要像使用 Toast 类一样使用整数,您可以执行以下操作:

public class MyClass {
    //by convention, constant names are all caps
    public static final int VALUE_ONE = 0;
    public static final int VALUE_TWO = 1;


    public void myMethod(int value) throws InvalidParameterException {
        if(value != VALUE_ONE || value != VALUE_TWO) {
            throw new InvalidParameterException();
            //or set default value instead of throwing an exception
        }
        else {
            //your code
        }
    }
}

VALUE_ONEandVALUE_TWO是静态的和最终的,这意味着在整个应用程序中只有一个该变量的实例,并且它的值永远不会改变(如果你知道 C,它类似于 a #DEFINE)。因此,当有人作为参数传递时MyClass.VALUE_ONE,您每次都确切地知道它是什么,而调用者不一定需要知道常量后面的整数值。然后您将需要进行运行时检查以确保传入的内容是有效值之一,如果不是,则抛出异常。或者,如果传入的值不是很关键,如果参数不正确,您可以设置一个默认值,而不是抛出异常。

于 2014-07-12T17:18:17.587 回答