我想编写一个只接受参数某些值的方法,比如f.e.在Android的Toast
课程中。您只能使用Toast.LENGTH_SHORT
或Toast.LENGTH_LONG
作为方法makeText(Context context, int resId, int duration)
的持续时间。我查看了Toast
类的源代码,但没有发现任何内容。我怎样才能做到这一点?
答案 0 :(得分:22)
您可以对此方法使用@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();
答案 1 :(得分:6)
使用Java Tutorial中的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;
}
}
答案 2 :(得分:1)
要像使用Toast类一样使用int,您可以执行以下操作:
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_ONE
和VALUE_TWO
是静态的和最终的,这意味着在整个应用程序中只有一个该变量的实例,并且它的值永远不会改变(如果你知道C,它是类似的到#DEFINE
)。因此,当有人将MyClass.VALUE_ONE
作为参数传递时,您每次都确切地知道它是什么,而调用者不一定需要知道常量后面的整数值。然后,您将需要执行运行时检查以确保传入的内容是有效值之一,如果不是,则抛出异常。或者,如果传入的值不是非常关键,如果参数不正确而不是抛出异常,则可以设置默认值。