Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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_Enums_Switch Statement - Fatal编程技术网

Java-使用;这";在枚举中?

Java-使用;这";在枚举中?,java,enums,switch-statement,Java,Enums,Switch Statement,我正在尝试使用枚举创建层次结构类型系统。我以前从未使用过枚举 此方法始终返回值。我想这是因为我用错了“this”,或者我完全误解了枚举 public enum Rank { PEASANT, TRADER, SQUIRE, MERCHANT, KNIGHT, NOBLE, KING; public Rank getNextRank() { switch (this) { case PEASANT:

我正在尝试使用枚举创建层次结构类型系统。我以前从未使用过枚举

此方法始终返回值。我想这是因为我用错了“this”,或者我完全误解了枚举

public enum Rank {
    PEASANT,
    TRADER,
    SQUIRE,
    MERCHANT,
    KNIGHT,
    NOBLE,
    KING;

    public Rank getNextRank() {
        switch (this) {
        case PEASANT:
            return SQUIRE;
        case SQUIRE:
            return KNIGHT;
        case KNIGHT:
            return NOBLE;
        case NOBLE:
            return KING;
        case KING:
            return PEASANT;
        }
        return PEASANT;
    }
}
(我知道KING案例不是必需的,但我喜欢它的可读性)

我想
Rank.farmer.getNextRank()
返回
Rank.SQUIRE
Rank.NOBLE.getNextRank()
返回
Rank.KING
,等等

如果在枚举中使用静态最终字段(在静态初始值设定项块中设置为
Rank.values()
),则可以避免调用
Rank.values()
(每次调用时都会创建一个新数组)

如果您可以将“next rank”传递给enum构造函数并将其存储为一个字段,那就太好了,但是在这种情况下这不起作用,因为您每次都会有效地使用前向引用。当然,您可以使用非final字段,并在静态初始值设定项中设置值:

public enum Rank {
    PEASANT,
    TRADER,
    SQUIRE,
    MERCHANT,
    KNIGHT,
    NOBLE,
    KING,

    private Rank next;

    static {
        PEASANT.next = TRADER;
        TRADER.next = SQUIRE;
        SQUIRE.next = MERCHANT;
        MERCHANT.next = KNIGHT;
        NOBLE.next = KING;
        KING.next = PEASANT;
    }

    public Rank getNextRank() {
        return next;
    }
}
这将更加灵活,例如,如果您想要两个“相等”的列组,它们都具有相同的“下一个”列组。

那么代码应该可以工作,但我个人只使用
ordinal()

如果在枚举中使用静态最终字段(在静态初始值设定项块中设置为
Rank.values()
),则可以避免调用
Rank.values()
(每次调用时都会创建一个新数组)

如果您可以将“next rank”传递给enum构造函数并将其存储为一个字段,那就太好了,但是在这种情况下这不起作用,因为您每次都会有效地使用前向引用。当然,您可以使用非final字段,并在静态初始值设定项中设置值:

public enum Rank {
    PEASANT,
    TRADER,
    SQUIRE,
    MERCHANT,
    KNIGHT,
    NOBLE,
    KING,

    private Rank next;

    static {
        PEASANT.next = TRADER;
        TRADER.next = SQUIRE;
        SQUIRE.next = MERCHANT;
        MERCHANT.next = KNIGHT;
        NOBLE.next = KING;
        KING.next = PEASANT;
    }

    public Rank getNextRank() {
        return next;
    }
}

这将更加灵活,例如,如果您想要两个“相等”的级别,而这两个级别都具有相同的“下一个”级别。

我无法在评论中表示这是有效的。请参见图片

再次检查流程。问题出在其他地方

System.out.println(Rank.SQUIRE.getNextRank());  //printed KNIGHT

我无法在评论中表达这是一个很好的工作方式。请看图片

再次检查流程。问题出在其他地方

System.out.println(Rank.SQUIRE.getNextRank());  //printed KNIGHT

你的方法非常有效。你的方法很有效。请把代码贴在调用它的地方…@Baadshah我不这么认为。我得到了Rank.farmer作为Rank.SQUIRE.getNextRank()@dragonmaray请检查附在屏幕截图上的帖子。你的方法非常有效。你的方法有效。请把代码贴在调用它的地方…@Baadshah我不这么认为。我得到了Rank.Farmer for Rank.SQUIRE.getNextRank()@DrAgonmoray请检查附在屏幕截图上的帖子。啊,你说得对。。。这个问题完全是另外一回事,超出了我应该在这里提出的任何问题的范围。感谢you@DrAgonmoray每个程序员都会遇到:)很高兴我能帮助你:)啊,你说得对。。。这个问题完全是另外一回事,超出了我应该在这里提出的任何问题的范围。感谢you@DrAgonmoray每个程序员都会遇到:)很高兴我能帮助你:)