2011-05-10 46 views
9

我有一個基本方向(北,東,南,西)枚舉類:Java:我可以在枚舉中使用兩個不同的名稱來計算相同的事情嗎?

public enum Direction { 
    NORTH, 
    EAST, 
    SOUTH, 
    WEST; 
} 

有沒有一種辦法能夠使用多個名字同樣的事情?例如這樣的事情:

public enum Direction { 
    NORTH or N, 
    EAST or E, 
    SOUTH or S, 
    WEST or W; 
} 

實際上是我想要的是能夠和簽署的變量N或北美,有兩個操作是完全一樣的。

例子:

Direction direction1=new Direction.NORTH; 
Direction direction2=new Direction.N; 
//direction1==direction2 

回答

9
public enum Direction { 
    NORTH, 
    EAST, 
    SOUTH, 
    WEST, 
    ; 

    // Convenience names. 
    public static final Direction N = NORTH; 
    public static final Direction E = EAST; 
    public static final Direction S = SOUTH; 
    public static final Direction W = WEST; 
} 

是合法的,但"N"不會自動生成valueOf法工作。即Direction.valueOf("N")將拋出IllegalArgumentException而不是返回Direction.NORTH。您也不能寫case N:。您必須使用switch es中的全名,其值爲Direction

除此之外,縮寫形式應該和完整版一樣。您可以在EnumSet的使用Direction.N,它比較平等Direction.N == Direction.NORTH,得到其name()(這是"NORTH"),import static yourpackage.Direction.N;

4

你可以做這樣的事情(東,西略)。

public enum Direction { 
    NORTH { 
     @Override 
     Direction getDirection() { 
      return NORTH; 
     } 
    }, 
    N { 
     @Override 
     Direction getDirection() { 
      return NORTH; 
     } 
    }, 
    SOUTH { 
     @Override 
     Direction getDirection() { 
      return SOUTH; 
     } 
    }, 
    S { 
     @Override 
     Direction getDirection() { 
      return SOUTH; 
     } 
    } ; 

    abstract Direction getDirection(); 
} 

,那麼你可以像這樣

public void foo(Direction arg) { 
    Direction d = arg.getDirection(); 
} 

那麼你將永遠是對付只有北,南,東,西。

+1

1+。沒想過。 – 2011-05-10 22:29:07

+0

但'N == NORTH'將返回false。這意味着你一定要記住使用'getDirection()',這很麻煩,並且使你的代碼變得脆弱......而且可能比你在添加'N'作爲縮寫之前更加冗長。 – 2011-05-10 23:47:11

+0

@Stephen同意。這不是一個理想的解決方案,而只是「A」解決方案。 – JustinKSU 2011-05-11 14:57:59

0

嗯,也許有一個「客戶端枚舉」的變量,其中包含實際的「有意義的枚舉」?

public enum Direction { 
    NORTH(BaseDirection.NORTH), 
    N(BaseDirection.NORTH), 
    EAST(BaseDirection.EAST), 
    E(BaseDirection.EAST), 
    SOUTH(BaseDirection.SOUTH), 
    S(BaseDirection.SOUTH), 
    WEST(BaseDirection.WEST), 
    W(BaseDirection.WEST); 

    private BaseDirection baseDirection; 

    private Direction(BaseDirection baseDirection) { 
     this.baseDirection = baseDirection; 
    } 

    public BaseDirection getBaseDirection() { 
     return baseDirection; 
    }   
} 

public enum BaseDirection { 
    NORTH, 
    EAST, 
    SOUTH, 
    WEST; 
} 

有點兒矯枉過正,但可以公開的方向客戶端代碼和使用getBaseDirection實際邏輯。

+0

如果你想要像N = NORTH這樣的東西,你需要做更多的事情。 – ChrisH 2011-05-10 23:42:31

+0

這個問題是N!= NORTH。您需要使用'equals'來比較方向值,'switch(direction){...}'需要使用兩個選項。它有點挫敗了使用枚舉的目的。 – 2011-05-10 23:42:57

相關問題