2014-12-16 2 views
4

좋아요. 지금 제가 작업중인 프로젝트의 코드를 작성 중입니다. 데이터 저장을위한 열거 형을 선택하는 것이 가장 좋습니다. 하지만 내 인생에서 처음으로 enum.ordinal()은 -1을 반환합니까? Java enum ordinal -1을 반환합니까?

을 Heres 코드 :

  DuelRules.Rules rule = DuelRules.Rules.values()[(buttonId - (buttonId < 29 ? 18 : 19))]; 
      if (buttonId == 29) { 
       rule = DuelRules.Rules.POCKET; 
      } 
      System.out.println(rule + ", " + rule.ordinal()); 
      rules.swapRule(player, other, rule); 
      reset(false); 

여기이 문 :

System.out.println(rule + ", " + rule.ordinal()); 

그것은 올바른 규칙 값을 출력하지만 rule.ordinal 인쇄 할 때()는 -1을 인쇄한다?

예 :

HAT, -1 

내 열거 :

public enum Rules { 
    HAT(5000, 1), 
    CAPE(5000, 2), 
    AMULET(5000, 4), 
    WEAPON(5000, 8), 
    BODY(5000, 16), 
    SHIELD(5000, 32), 
    LEG(5000, 128), 
    GLOVE(5000, 512), 
    BOOT(5000, 1024), 
    RING(5000, 4096), 
    ARROW(5000, 8192), 
    POCKET(17837, 1), 

    FORFEIT(4989), 
    MOVEMENT(4990), 
    RANGE(4991), 
    MELEE(4992), 
    MAGIC(4993), 
    DRINKS(4994), 
    FOOD(4995), 
    PRAYER(4996), 
    OBSTACLES(4997), 
    FUN_WEAPONS(4998), 
    NO_ABILITIES(4999), 
    SUMMONING(5001); 

    private final int varbitId; 
    private final int value; 

    private Rules(int id, int... value) { 
     this.varbitId = id; 
     this.value = value.length > 0 ? value[0] : 0; 
    } 

} 

주, 그 열거가 다른 클래스의 내부, 즉 결과에 영향을 줄 수 있는지 확실하지 않습니다. 도와 줘서 고마워. 이걸로 완전히 잃어 버렸어.

EDIT : 더 자세히 검토하면 서수가 인수로 전달되어 변경되었음을 알았습니까? 콘솔의

Screnshot :

코드 :

이 점 하나 인쇄
 } else if (buttonId >= 18 && buttonId <= 42) { 
      DuelRules.Rules rule = DuelRules.Rules.values()[(buttonId - (buttonId < 29 ? 18 : 19))]; 
      System.out.println("Point one: "+rule + ", " + rule.ordinal()); 

      rules.swapRule(player, other, rule); 

      getDuel(other).rules.setRules(player, other, rules 
        .rules); 
      reset(false); 
      sendFlash(interfaceId, buttonId); 
     } 

, 규칙과 .ordinal,이 경우 장애물에, 올 20

하지만 rules.swapRule의 규칙 매개 변수를 전달하는 곳에서는 서수가 -1로 변경됩니까?

public boolean swapRule(Player player, Player other, Rules rule) { 
    System.out.println("Point 2(swapRule): " + rule + ", " + rule.ordinal()); 
} 

인수로 전달할 때 규칙 매개 변수의 변경 원인은 무엇입니까?

+1

* 대부분의 프로그래머는이 방법을 사용하지 않습니다. EnumSet 및 EnumMap * ([javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html))과 같은 정교한 enum 기반 데이터 구조에서 사용하도록 설계되었습니다. # 서수 % 28 % 29)). 요소 인덱스로 작업해야 할 때 enum을 사용하는 것은 나쁜 습관입니다. – Everv0id

+10

이것을 재현 할 수 없습니다. 완전하고 재현 가능한 예를 게시하십시오. –

+0

나는 투표 할 수 없습니다. 당신이 기술하고있는 것은'Enum # ordinal()'에 대한 javadoc에 대한 것이지 당신은 아직 증명을 제공하지 못했다. –

답변

2

귀하의 접근 방법은 열거자를 사용하는 완전한 목적을 무효화합니다. 대신 인덱스와 함께 엉망으로 당신은 당신은 반사에 의해이 결과를 얻을 수있는 그런 다음 ActoinListener에서이

public void actionPerformed (ActionEvent e) { 
    if (Rule.valueOf (e.getActionCommand()) == Rules.HAT) { 
     //HAT related button was called, process it 
    } 
} 
+6

요점을 놓치고 있습니다. 우리는 모두 영업 코드를 향상시킬 수 있지만 사실은'System.out.println (rule + ","+ rule.ordinal()); 라인이 HAT를 생성하는 것은 완전히 불가능해야한다는 것입니다. 1. OP가 오해되었거나 심각하게 잘못되었습니다. –

+2

저는 열거 형의 목적에 더 적합한 대안을 제안하고 있습니다. 또한, 나는 사람들이 Google을 통해이 질문에 도달 할 수있는 다른 사람들을 위해 적어도 사람들이 더 나은 알레르기가 존재 하는지를 알 수 있도록해야한다고 생각합니다. 아래 표와 동의하지 마십시오 죄송합니다 – akhilless

+1

동의합니다. 이것은 정답입니다. OP가 후드 아래에서 어지럽히 지 않아야합니다. – EJP

1

를 사용하여 클릭 한 버튼을 확인할 수 있습니다 직접

button.setActionCommand (Rules.HAT.toString()); 

같이 열거을 사용할 수

import java.lang.reflect.Field; 

public class Main { 

    enum Fruit { APPLE } 

    public static void main(String[] args) { 
     try { 
      Field field = Fruit.class.getSuperclass().getDeclaredField("ordinal"); 
      field.setAccessible(true); 
      field.set(Fruit.APPLE, -1); 
     } catch (Exception e) { 
     } 
     System.out.println(Fruit.APPLE + ", " + Fruit.APPLE.ordinal()); 
    } 
} 

그러나 누구나 실수로이 작업을 수행 할 수 있을지는 의문입니다.

관련 문제