Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从现有枚举//枚举别名生成内部枚举_Java - Fatal编程技术网

Java 从现有枚举//枚举别名生成内部枚举

Java 从现有枚举//枚举别名生成内部枚举,java,Java,存在一个枚举 公共枚举方向{ 左边 正确的 } 我可以通过Direction.LEFT访问它,我也想通过myObject.Direction.LEFT访问它: 公共类MyClass{ 公共???方向=???; } MyClass myObject=新的MyClass(); 断言myObject.direction.LEFT==direction.LEFT; 我怎样才能像上面那样给一个枚举加上别名,就好像它是一个嵌套的内部枚举一样 (我希望这样做的原因是,我可以通过GraalVM中的宿主对象m

存在一个枚举

公共枚举方向{
左边
正确的
}
我可以通过
Direction.LEFT
访问它,我也想通过
myObject.Direction.LEFT
访问它:

公共类MyClass{
公共???方向=???;
}
MyClass myObject=新的MyClass();
断言myObject.direction.LEFT==direction.LEFT;
我怎样才能像上面那样给一个枚举加上别名,就好像它是一个嵌套的内部枚举一样


(我希望这样做的原因是,我可以通过GraalVM中的宿主对象
myObject
方向传递到IL的环境)

严格来说,你不能这样做。在Java中,您不能“引用”或别名这样的类型

您试图做的事情似乎很像使用常量。我不知道您为什么要这样做,但这里有一个版本在第三类中使用final属性:

public static class MyClass {
    public DirectionHolder direction = new DirectionHolder();

    public static class DirectionHolder {
        public final Direction LEFT = Direction.LEFT;
        public final Direction Right = Direction.RIGHT;
    }
}

这将使您的
myObject.direction.LEFT==direction.LEFT代码编译并运行,但它有局限性。除此之外,
DirectionHolder
需要进行维护,以便它与
方向保持同步

您可以在不做任何特殊操作的情况下执行此操作:

public class MyClass {
  public Direction direction;
}
您将能够访问
myObject.direction.LEFT
,它将引用与
direction.LEFT
完全相同的对象

这是因为每个枚举常量都是静态的final字段(),并且

但是,如果此
方向
字段的唯一目的是为
方向.LEFT
方向.RIGHT
创建别名,则会非常混乱,因为字段的目的是存储数据

如何为枚举设置别名

不能对整个枚举进行别名,但可以单独对每个值进行别名,我不推荐这样做

public static final Direction LEFT=Direction.LEFT;
公共静态最终方向右侧=Direction.RIGHT;

由于
MyClass.LEFT
Direction.LEFT
都是指同一个对象,所以对枚举使用
=
的常用功能仍然有效,即
MyClass.LEFT==Direction.LEFT
是真的。

这对我来说没有任何意义。对我来说也没有意义。断言myObject.direction==direction.LEFT要合理得多这是如何工作的?我很惊讶它在没有任何赋值的情况下工作,为什么不像大多数其他类型那样
myObject.direction
只是
null
LEFT
是一个静态字段。我是否可以去掉
方向。LEFT.right.LEFT.right.right
是有效的,并且与
方向.right
完全相同?@theonlygusti是的,因为静态字段是如何工作的,但我建议你永远不要写这样的东西,因为它非常混乱。实际上我得到了一个错误
无法读取null的属性'LEFT'