나는이 질문과 비슷한 다양한 Q & A를 보았지만 해결책을 찾지 못했습니다.
내가 가진 것은 TV 가이드를 보는 다양한 방법을 나타내는 열거 형입니다.
NDroid Application
클래스에서
static enum guideView {
GUIDE_VIEW_SEVEN_DAY,
GUIDE_VIEW_NOW_SHOWING,
GUIDE_VIEW_ALL_TIMESLOTS
}
… 사용자가 뷰를 변경하면 이벤트 핸들러 int
가 0-2에서 수신하고 다음과 같이하고 싶습니다 …
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에서 switch-case로 어떻게 할 수 있는지 궁금했습니다.
편집 죄송합니다. 저는 일반적인 Java 문제로보고 있었기 때문에 문제를 완전히 확장하지 않았습니다. 좀 더 설명하기 위해 질문에 추가했습니다.
Android에 특정한 것이 없으므로 Android로 태그를 지정하지 않았지만 열거 형은 Application
클래스에 정의되어 있고 스위치를 원하지 않는 코드는 Activity
. 열거 형은 여러 활동에서 액세스해야하므로 정적입니다.
답변
누락 된 부분은 정수에서 유형 안전 열거 형으로 변환하는 것입니다. Java는 자동으로 수행하지 않습니다. 이에 대해 몇 가지 방법이 있습니다.
- 형식이 안전한 열거 형 대신 정적 최종 정수 목록을 사용하고받은 int 값을 켭니다 (이는 Java 5 이전 접근 방식입니다).
- 지정된 id 값 ( heneryville에 설명 된대로 ) 또는 열거 형 값의 서수 값을 켭니다 . 즉
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의 몇 가지 사용법을 좋아합니다.
- .name ()을 사용하면 문자열에서 열거 형 이름을 가져올 수 있습니다.
- .ordinal ()을 사용하면 0부터 시작하는 정수 값을 가져올 수 있습니다.
- 각 열거 형에 다른 값 매개 변수를 첨부 할 수 있습니다.
- 물론 스위치가 활성화됩니다.
값 매개 변수가있는 열거 형 :
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
편집 : 정적 열거 형을 정의 하시겠습니까? 그것은 나에게 옳지 않은 것 같습니다. 열거 형은 다른 객체와 매우 유사합니다. 코드가 컴파일되고 실행되지만 잘못된 결과를 제공하는 경우 아마도 이것이 그 이유 일 것입니다.
답변
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 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”안의 한정자를 생략하는 것이 핵심입니다.