Toast
Android のクラスの fe のように、パラメーターに特定の値のみを受け取るメソッドを作成したいと考えています。Toast.LENGTH_SHORT
またはToast.LENGTH_LONG
メソッドの期間としてのみ使用できますmakeText(Context context, int resId, int duration)
。クラスのソースコードを見てみましたToast
が、何も見つかりませんでした。どうすればそれを達成できますか?
3 に答える
次のように、メソッドに@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();
Java チュートリアルの列挙型を使用します。
列挙型は、変数を事前定義された定数のセットにすることができる特別なデータ型です。変数は、事前定義された値の 1 つと等しくなければなりません。一般的な例には、コンパスの方向 (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;
}
}
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
は静的で最終的なものです。つまり、アプリケーション全体を通して、その変数のインスタンスは 1 つだけであり、その値は決して変化しません (C を知っていれば、 に似ています#DEFINE
)。したがって、誰かがMyClass.VALUE_ONE
引数として渡されると、毎回それが何であるかを正確に知ることができますが、呼び出し元は必ずしも定数の背後にある整数値を知る必要はありません。次に、ランタイム チェックを実行して、渡された値が有効な値の 1 つであることを確認し、そうでない場合は例外をスローします。または、渡された値がそれほど重要でない場合、引数が正しくない場合は、例外をスローするのではなく、デフォルト値を設定できます。