【问题标题】:Help with enums in JavaJava中的枚举帮助
【发布时间】:2010-04-16 01:58:30
【问题描述】:

是否可以让枚举更改其值(从内部)?也许更容易理解我对代码的意思:

enum Rate {
    VeryBad(1),
    Bad(2),
    Average(3),
    Good(4),
    Excellent(5);

    private int rate;

    private Rate(int rate) {
        this.rate = rate;
    }

        public void increateRating() {
            //is it possible to make the enum variable increase?
            //this is, if right now this enum has as value Average, after calling this
            //method to have it change to Good?
       }
}

这是我想要实现的目标:

Rate rate = Rate.Average;
System.out.println(rate); //prints Average;
rate.increaseRating();
System.out.println(rate); //prints Good

谢谢

【问题讨论】:

    标签: java enums


    【解决方案1】:

    是的。你可以简单地调用

    rate = Rate.Good;
    

    针对这种特定情况。但我认为您真正在寻找的是后继功能。

    Here你是:

    public class EnumTest extends TestCase {
        private enum X {
            A, B, C;
            public X successor() {
                    return values()[(ordinal() + 1) % values().length];
            }
        };
    
        public void testSuccessor() throws Exception {
            assertEquals(X.B, X.A.successor());
            assertEquals(X.C, X.B.successor());
            assertEquals(X.A, X.C.successor());
        }
    }
    

    【讨论】:

    • + 1. 这可能是最好的方法。代码也很简洁。
    • 但是...Rate 它自己不会改变是吗?
    • @Oscar 我认为这个想法是吞噬会做类似rate = rate.successor();
    • 在我的示例中,只需调用x = x.successor(); 你的可能看起来更像rate = rate.nextRating();(当然,取决于你如何命名函数)。如果您想更改枚举本身的值 - 而不是保存枚举的变量 - 不,这是不可能的。
    • successor() 方法中的唯一注释 values() 可能应该被缓存。它被调用了两次,并且该操作的成本很高。
    【解决方案2】:

    你想要这样的东西吗?

    class Rate {
        private static enum RateValue {
            VeryBad(1),
            Bad(2),
            Average(3),
            Good(4),
            Excellent(5);
    
            private int rate;
    
            public RateValue(int rate) {
                this.rate = rate;
            }
    
            public RateValue nextRating() {
                switch (this) { /* ... */ }
            }
        }
    
        private RateValue value;
    
        public void increaseRating() {
            value = value.nextRating();
        }
    }
    

    【讨论】:

      【解决方案3】:

      问题中的示例尝试通过调用“rate”的方法来更改它的值。这是不可能的,枚举值是对象,因此您无法更改它们,原因与您无法为“this”分配新值的原因相同。您可以做的最接近的事情是添加一个返回另一个枚举值的方法,正如 Carl Manaster 所建议的那样。

      【讨论】:

      • +1 :真正的原始问题(如“这是我想要实现的目标”所阐明的那样)只有这个答案:不,你不能。
      • 是的,我想我自己也得出了同样的结论。
      【解决方案4】:

      这应该是可能的,但我不得不承认我从未尝试过。最后,枚举只是有一点扭曲的对象,所以你应该能够做到这一点,除非你将 rate 字段定义为 final。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        相关资源
        最近更新 更多