この質問に似たSOに関するさまざまなQ&Aを見てきましたが、解決策が見つかりませんでした。
私が持っているのは、TVガイドを表示するさまざまな方法を表す列挙型です...
NDroid Application
クラス
static enum guideView {
GUIDE_VIEW_SEVEN_DAY,
GUIDE_VIEW_NOW_SHOWING,
GUIDE_VIEW_ALL_TIMESLOTS
}
...ユーザーがビューを変更すると、イベントハンドラーは0-2からint
を受け取り、このようなことをしたいと思います...
Android Activity
onClick(DialogInterface dialog, int which)
イベントハンドラー
// 'which' is an int from 0-2
switch (which) {
case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
...
break;
}
私は上記のようなものを許可するC#列挙とselect/case文に慣れており、Javaは異なることをすることを知っていますが、何をする必要があるのか理解できません。
if
ステートメントに頼らなければなりませんか?おそらく3つの選択肢しかありませんので、私はそれを行うことができますが、Javaのスイッチケースを使用してどのように行うことができるのか疑問に思いました。
EDIT申し訳ありませんが、この問題は一般的なJava問題であると考えていたため、完全には展開していませんでした。質問に追加して、もう少し説明します。
Android固有のものはないため、Androidとしてタグ付けしませんでしたが、列挙型はApplication
クラスとスイッチを使用しないコードで定義されていますActivity
にあります。複数のアクティビティからアクセスする必要があるため、列挙型は静的です。
不足している部分は、整数から型保証された列挙型への変換です。 Javaは自動的にそれを行いません。これについては、いくつかの方法があります。
guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
Int値で表される列挙値を決定し、列挙値をオンにします。
enum GuideView {
SEVEN_DAY,
NOW_SHOWING,
ALL_TIMESLOTS
}
// Working on the assumption that your int value is
// the ordinal value of the items in your enum
public void onClick(DialogInterface dialog, int which) {
// do your own bounds checking
GuideView whichView = GuideView.values()[which];
switch (whichView) {
case SEVEN_DAY:
...
break;
case NOW_SHOWING:
...
break;
}
}
適切な列挙値を解決するために整数値を引数として使用し、境界チェックを一元化できるカスタムvalueOf
実装を作成する方が、より便利でエラーが少ないことがわかります。
whichView
がGuideView Enumのオブジェクトである場合、以下が適切に機能します。 case
の後に定数の修飾子がないことに注意してください。
switch (whichView) {
case SEVEN_DAY:
...
break;
case NOW_SHOWING:
...
break;
}
列挙は、NDroid.guideView.GUIDE_VIEW_SEVEN_DAY
のようにケースラベル内で修飾しないでください。代わりに、修飾を削除してGUIDE_VIEW_SEVEN_DAY
を使用する必要があります。
Java enumのいくつかの使用法が好きです:
値パラメーターを持つ列挙型:
enum StateEnum {
UNDEFINED_POLL ( 1 * 1000L, 4 * 1000L),
SUPPORT_POLL ( 1 * 1000L, 5 * 1000L),
FAST_POLL ( 2 * 1000L, 4 * 60 * 1000L),
NO_POLL ( 1 * 1000L, 6 * 1000L);
...
}
スイッチの例:
private void queuePoll(StateEnum se) {
// debug print se.name() if needed
switch (se) {
case UNDEFINED_POLL:
...
break;
case SUPPORT_POLL:
...
break;
これは、説明したとおりに機能するはずです。どのようなエラーが発生していますか?コードを貼り付けることができれば助かります。
http://download.Oracle.com/javase/tutorial/Java/javaOO/enum.html
編集:静的列挙型を定義してもよろしいですか?それは私には正しく聞こえません。列挙型は、他のオブジェクトとよく似ています。コードをコンパイルして実行しても、誤った結果が得られる場合、これがおそらく理由です。
短い連想関数の例:
public String getIcon(TipoNotificacao tipo)
{
switch (tipo){
case Comentou : return "fa fa-comments";
case ConviteEnviou : return "icon-envelope";
case ConviteAceitou : return "fa fa-bolt";
default: return "";
}
}
@Dhanushkaが言ったように、「switch」内の修飾子を省略することが重要です。
enumerations accessing is very simple in switch case
private TYPE currentView;
//declaration of enum
public enum TYPE {
FIRST, SECOND, THIRD
};
//handling in switch case
switch (getCurrentView())
{
case FIRST:
break;
case SECOND:
break;
case THIRD:
break;
}
//getter and setter of the enum
public void setCurrentView(TYPE currentView) {
this.currentView = currentView;
}
public TYPE getCurrentView() {
return currentView;
}
//usage of setting the enum
setCurrentView(TYPE.FIRST);
avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always
私はそれをやっている
public enum State
{
// Retrieving, // the MediaRetriever is retrieving music //
Stopped, // media player is stopped and not prepared to play
Preparing, // media player is preparing...
Playing, // playback active (media player ready!). (but the media player
// may actually be
// paused in this state if we don't have audio focus. But we
// stay in this state
// so that we know we have to resume playback once we get
// focus back)
Paused; // playback paused (media player ready!)
//public final static State[] vals = State.values();//copy the values(), calling values() clones the array
};
public State getState()
{
return mState;
}
Switchステートメントで使用します
switch (mService.getState())
{
case Stopped:
case Paused:
playPause.setBackgroundResource(R.drawable.selplay);
break;
case Preparing:
case Playing:
playPause.setBackgroundResource(R.drawable.selpause);
break;
}