【问题标题】:How to get next in static enum如何在静态枚举中获得下一个
【发布时间】:2014-10-09 00:59:39
【问题描述】:
public enum Planet { 
    MERCURY(false),
    VENUS(false),
    EARTH(false),
    MARS(false),
    JUPITER(false),
    SATURN(false),
    URANUS(false),
    NEPTUNE(false); 
}

    public boolean isCurrent;

    Planet(boolean isCurrent){
       this.isCurrent = isCurrent;
    }

    public static void next(){
    if(planet == VENUS){
        VENUS.isCurrent = false;
        EARTH.isCurrent = true;
        MARS.isCurrent = false;
        JUPITER.isCurrent = false;
        SATURN.isCurrent = false;
        URANUS.isCurrent = false;
        NEPTUNE.isCurrent = false;
    }
    if(planet == EARTH){
        VENUS.isCurrent = false;
        EARTH.isCurrent = false;
        MARS.isCurrent = true;
        JUPITER.isCurrent = false;
        SATURN.isCurrent = false;
        URANUS.isCurrent = false;
        NEPTUNE.isCurrent = false;
    }
...  
}

我找到了这个解决方案,

private enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE;
    public Planet getNext() {
        return this.ordinal() < Planet.values().length - 1
            ? Planet.values()[this.ordinal() + 1]
            : null;
    }
}

但我无法使用 this 因为此枚举在其他类中作为静态导入;

现在我使用跟随结构:

 public static Planet setNewCurrent(){
    for(Planet planet : Planet.values()){
        if(planet == VENUS){
            VENUS.isCurrent = false;
            EARTH.isCurrent = true;
            MARS.isCurrent = false;
            JUPITER.isCurrent = false;
            SATURN.isCurrent = false;
            URANUS.isCurrent = false;
            NEPTUNE.isCurrent = false;
        }
        if(planet == EARTH){
            VENUS.isCurrent = false;
            EARTH.isCurrent = false;
            MARS.isCurrent = true;
            JUPITER.isCurrent = false;
            SATURN.isCurrent = false;
            URANUS.isCurrent = false;
            NEPTUNE.isCurrent = false;
        }
...
    }
}   

有谁知道像这样getNextPlanet() 的便捷方法

planet.getNext().isCurrent = true;

【问题讨论】:

  • Java 枚举不等同于其他语言中的枚举。它们并不意味着具有特定的“顺序”,因此没有“下一个”的概念。
  • @Zhuiden 是的 .values 方法存在,但也使用反射,因此我认为它不是一个好方法。

标签: java static enums next


【解决方案1】:

我希望您确实意识到您可以拥有类似以下的内容:

public enum Planet { 
    MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE; 

    public Planet getNext() {
        return this.ordinal() < Planet.values().length - 1
            ? Planet.values()[this.ordinal() + 1]
            : null;
    }
}

private Planet planet;

public void someFunction()
{
    planet = Planet.MARS;
    planet = planet.getNext();
    if(planet != null)
    {
        doStuff();
    }
}

当然,您可以根据在字段变量中选择的任何一个来使用带有枚举的 switch-case 语句:Java using enum with switch statement

根本不需要一个布尔变量来确定哪个是“当前选择的”。

编辑:根据您的评论,您需要一个 Planet 的单例实例。幸运的是,您可以为此使用枚举本身:

public enum Planet { 
    MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE; 

    private static Planet currentPlanet = MERCURY;

    public static Planet getCurrentPlanet()
    {
        return currentPlanet;
    }

    public static boolean setToNext() {
        boolean retVal = this.ordinal() < Planet.values().length - 1;
        currentPlanet = this.ordinal() < Planet.values().length - 1
                ? Planet.values()[this.ordinal() + 1]
                : Planet.values()[0];
        return retVal; //returns false when it was the last element of the enum
    }
}


public void doSomething()
{
    Planet planet;
    do
    {
        planet = Planet.getCurrentPlanet();
        //do things with planet, like write out their names
        System.out.println(planet.name());
    }
    while(Planet.setToNext());
}

【讨论】:

  • thx,但 someFunction() 不是静态的,如果不创建此枚举的实例,我仍然无法使用它。此代码示例只是来自所有枚举的 sn-p,并且基于静态导入的应用程序中的逻辑过多。
  • Planet.MARS 是枚举的一个实例,如果你没有想法,那么Planet.values()[0]也是如此
  • 我知道这一点,我的意思是在外部类中我使用简单的构造 setNext() 然后每个将此枚举作为静态导入的类都将通过 getCurrent() 获取当前状态。
  • 哦,你想要一个单例选择的枚举字段。您可以通过使 Planet planet; 成为枚举本身的字段变量来轻松破解它
  • 不错的技巧,改变了返回值()[(ordinal() + 1) % values().length];它就像一个冠军,ty。
【解决方案2】:

这不是使用枚举的正确方法。您不应该在每个枚举常量上都有 boolean isCurrent

相反,在一个地方(不在枚举上)有一个 Planet currentPlanet 变量:

Planet currentPlanet = Planet.MERCURY;

当你想获得下一个时:

currentPlanet = currentPlanet.getNext();

【讨论】:

  • 就我而言,无法创建枚举实例。
  • @Dmitrii 您已经有一个实例。实际上,您有 8 个实例:每个行星一个。这就是枚举常量:枚举类的实例。
  • 我从外部类中使用这个枚举:import static Planet.*;设置下一个当前();我只需要从这里查看 currentPlanet 到底是什么
  • @Dmitrii 导入是静态的并不重要。每个常量仍然是枚举类的一个实例,即使它是类的静态成员。试试吧,你会发现它有效:Planet p = MERCURY; p = p.getNext(); System.out.println(p).
【解决方案3】:
    public enum Planet {
        EARTH,
        MARS;

        public static Planet current = EARTH;

        Planet() {
        }

        public Planet getNext() {
            return values()[(ordinal() + 1) % values().length];
        }

        public static void setNext(){
            current = current.getNext();
        }

        public static Planet getCurrent(){
            return current;
        }


    }

import static com.test.Planet.*;

    public class Main {
        public static void main(String[] args){
            getCurrent();
            setNext();
        }
    }

【讨论】:

  • 是的,这几乎是我在编辑中添加的内容,但我还可以使用 setNext() 函数遍历所有枚举值,以便有一个指示您已处理每个元素。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2022-12-17
  • 2010-09-11
相关资源
最近更新 更多