Java:我可以在一个枚举中使用两个不同的名称来计算同一事物吗?

Java:我可以在一个枚举中使用两个不同的名称来计算同一事物吗?,java,enums,namespaces,elements,equivalent,Java,Enums,Namespaces,Elements,Equivalent,我有一个带有基本方向(北、东、南、西)的枚举类: 有没有一种方法可以为同一件事使用多个名称?例如,类似这样的事情: public enum Direction { NORTH or N, EAST or E, SOUTH or S, WEST or W; } 实际上,我想要的是能够对一个变量N或NORTH进行签名,并使这两个操作完全相同 例如: Direction direction1=new Direction.NORTH; Direction directi

我有一个带有基本方向(北、东、南、西)的枚举类:

有没有一种方法可以为同一件事使用多个名称?例如,类似这样的事情:

public enum Direction {
    NORTH or N,
    EAST or E,
    SOUTH or S,
    WEST or W;
}
实际上,我想要的是能够对一个变量N或NORTH进行签名,并使这两个操作完全相同

例如:

Direction direction1=new Direction.NORTH;
Direction direction2=new Direction.N;
//direction1==direction2
是合法的,但是
“N”
将不适用于自动生成的
valueOf
方法。也就是说,
Direction.valueOf(“N”)
将抛出一个
illegargumentexception
而不是返回
Direction.NORTH

您也不能写入
案例N:
。您必须使用
开关
es中的全名,其值为
方向


除此之外,缩写形式应该和完整版本一样有效。您可以在
EnumSet
s中使用
Direction.N
,比较它是否相等
Direction.N==Direction.NORTH
,获取它的
name()
(即
“NORTH”
),导入静态包。Direction.N,等等。

您可以这样做(东、西省略)

那么你可以做这样的事情

public void foo(Direction arg) {
  Direction d = arg.getDirection();
}
然后,您将始终只处理北、南、东和西。

嗯,可能有一个“客户端枚举”,其中的变量包含实际的“有意义的枚举”


有点过分,但您可以向客户机代码公开方向,并使用
getBaseDirection
进行实际逻辑

1+。我没想过。但是
N==NORTH
将返回false。这意味着您必须始终记住使用
getDirection()
,这很麻烦,而且会使代码变得脆弱。。。“而且可能比您添加
N
作为缩写之前更加冗长了。”斯蒂芬同意。这不是一个理想的解决方案,只是一个“A”解决方案。如果您希望:N==NORTH这样的值为真,则需要做更多的工作。问题是N!=北方。您需要使用
equals
比较方向值,并且
开关(方向){…}
需要同时使用这两个选项。这有点违背了使用枚举的目的。
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;
}
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();
}
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;
}