9

I have an enum class with the cardinal directions(North, East, South, West):

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

Is there a way to be able to use multiple names for the same thing? For example something like this:

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

In practice what I want is to be able and sign to a variable either N or NORTH and have the two operations be exactly the same.

Example:

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

3 回答 3

12
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:。您必须在switches 中使用其值为 a的全名Direction

除此之外,缩写形式应该和完整版本一样工作。您可以使用Direction.Nin EnumSets,比较它是否相等Direction.N == Direction.NORTH,获取它的name()(即"NORTH"import static yourpackage.Direction.N;,等等。

于 2011-05-10T22:19:49.623 回答
5

你可以做这样的事情(东方和西方省略)。

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();
}

那么您将始终只处理 NORTH、SOUTH、EAST 和 WEST。

于 2011-05-10T22:22:38.610 回答
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用于实际逻辑。

于 2011-05-10T22:27:16.817 回答