2014-07-09 5 views
2

방금 ​​Java로 첫 걸음을 시작하고 모든 기본 사항을 익혔지만 필요한 열거 형 문제를 발견했습니다. 용서해주세요. 내 문제에 대한 해결책이 아주 분명하다면 :각 열거 형 인스턴스에 증가하는 ID를 할당하십시오.

그래서이 열거 형을 가지고 있고 0부터 위쪽으로 세는 각 인스턴스에 고유 한 ID를 추가하려고합니다. 각 생성자를 호출 할 때 다른 매개 변수를 추가하지 않아도됩니다 (나중에 ofc 오류가 발생할 수 있으므로).

public enum TerrainTile{ 

WATER(1), GRASSLAND(1), HILL(2), FORREST(2), BLANK(99); 

private final int id; 
private final int moveCost; 
private boolean hidden = true; 

private TerrainTile(int moveCost) { 
    this.moveCost = moveCost; 
} 

는 그리고 난 그냥

private TerrainTile(int moveCost) { 
    this.id = nextID++; 
    this.moveCost = moveCost; 
} 

에 생성자를

static int nextID = 0; 

를 추가하고 편집에 생각하지만 그것은 내부의 정적 필드를 참조 할 수 없다는 오류 메시지가 이니셜 라이저.

해결 방법이 있습니까?

답변

5

ordinal() 방법을 사용할 수 있습니다. 멤버가 소스 코드에서 선언되고 0부터 계산되는 순서를 기반으로합니다. 그래서 나는 당신이 필요로하는 것과 정확히 같아요.

그냥 참고 : 당신은 호출하여 서수에서 원래 열거 형 멤버를 얻을 수 .values()[index]

예 :

int hillOrdinal = TerrainTile.HILL.ordinal(); // 2 
TerrainTile hill = TerrainTile.values()[hillOrdinal]; 
0

그것은 당신이 클래스 기능을 결합하려고 같은 소리 enum. 열거 형 선언에서 비 최종적이고 비 정적 인 멤버 필드에 특히주의해야합니다. TerrainTile 클래스 (가능하면 단일 인스턴스 별 동작을 원할 경우 flyweight)와 TerrainTileType (또는 TerrainTile.Type) 열거 형을 사용하여 원하는 동작을 가장 잘 수행 할 수 있습니다. 다음과 같은 내용 :

public class TerrainTile { 
    public enum Type { 
     WATER(1), GRASSLAND(1), HILL(2), FORREST(2), BLANK(-1); 
     public final int MOVE_COST; 
     private TerrainTile(int moveCost) { 
      this.MOVE_COST = moveCost; 
     } 
     public boolean isTraversable() { 
      return (MOVE_COST > 0); 
     } 
    } 

    private final Type type; 
    private final Image texture; 
    ... 
    private TerrainTile(Type type) { 
     this.type = type; 
    } 

    private static final Map<Type, TerrainTile> tiles = new EnumMap<>(); 
    static { 
     // instantiate one TerrainTile for each type and store into the tiles Map 
     for (Type type: Type.values()) { 
      // Eventually, also load tile textures or set Color in this step 
      tiles.put(type, new TerrainTile(type)); 
     } 
    } 

    public static TerrainTile getTile(Type type) { 
     // return the reference to the TerrainTile of this type 
     return tiles.get(type); 
    } 

    ... 
}