【问题标题】:Enumbody error how can i fix it?Enumbody错误我该如何解决?
【发布时间】:2012-12-04 23:15:46
【问题描述】:

我在做学校作业时,发现了一个叫做 Enum 的东西。

我认为这对我的家庭作业很有帮助。

所以我决定使用它,但是当这个错误出现时。

我在谷歌上搜索了有关它的东西,但我似乎无法修复它。

错误“插入枚举以完成编译单元”出现在数字 15

public enum TimeToClock {   

    9,9.5,
    10,10.5,
    11,11.5,
    12,12.5,
    13,13.5,
    14,14.5,
    15,15.5,
    16,16.5,
    17. 

}

这是对this question中代码的改进尝试

【问题讨论】:

  • 你想通过将所有这些数字放在枚举的主体中来实现什么?
  • 这不是您可能正在寻找的枚举的使用。请明确说明您想要什么?
  • 枚举是完整的还是 17. 不完整?这可能会导致错误
  • 这是我以前的帖子,你可以在那里看到我的代码。我认为通过使用枚举,如果没有嵌套的 if 语句,代码会更整洁。因此,当用户输入“1”时,他们将得到 9。如果他们输入“2”,他们将得到 9.5。等等等等
  • @user1872886 查看您上一个问题的代码,我认为枚举不是最好的解决方案。相反,构建一个从代码到时间值的map。创建一个HashMap<String,Double>,然后添加所有代码映射(例如map.put("1",9.0))。然后,你可以做clock1 = map.get(time1);

标签: java enums


【解决方案1】:

我会使用一个双精度数组。

static final double[] timeToClock = {
    9,  9.5,
    10, 10.5,
    11, 11.5,
    12, 12.5,
    13, 13.5,
    14, 14.5,
    15, 15.5,
    16, 16.5,
    17
};

或@Puce 建议的列表

static final List<Double> timeToClock = Arrays.asList(
    9,  9.5,
    10, 10.5,
    11, 11.5,
    12, 12.5,
    13, 13.5,
    14, 14.5,
    15, 15.5,
    16, 16.5,
    17
);

【讨论】:

    【解决方案2】:

    问题在于枚举的概念不仅仅用来存储一组常量,而是一组常量,这对你来说有意义,但实际上是你的枚举的实例,所以直接存储浮点数是行不通的。

    您插入的每个数字都必须具有合法的 Java 变量名称,例如:

    public enum TimeToClock {
      _9(9.0f),
      _9_5(9,5f)
      ;
    
      public final float value;
    
      public TimeToClock(float value) {
        this.value = value
      }
    }
    

    通过这种方式,您可以使用_9.value 引用您的字段,我想这是您可以将枚举用于特定目的的唯一方法。对于您可以使用的任何其他内容:

    • 一个数组float[] values = new float[]{9f, 9.5f, .... };
    • 常量如public static final float _9_5 = 9.5f

    如果您可以将含义与每个数字相关联,则使用枚举是有意义的,在您的情况下,您仍然可以通过对允许的值集进行静态编译检查来毫无问题地使用它,但是正如您所看到的语法非常笨拙,因为每个value 只是一个值。

    【讨论】:

      【解决方案3】:

      枚举常量应该是适当的变量名,在 Java 中,变量名不能以数字开头。你可以试试这个:

      public enum TimeToClock {    
        T9, T9_5,
        T10, T10_5
        // Go on
      }
      

      【讨论】:

        【解决方案4】:

        enum 中不允许直接使用整数,因为整数本身没有意义。

        大多数人会使用Strings'array,因为这是实现目标的最简单方法。

        但是,想象一下,如果您想像这样将调度传递给方法参数:

        public void pronounceSchedule(String schedule){
           // Nothing ensures that a valid Schedule is passed !
        }
        

        使用枚举,您将获得预期的保证:

        public void pronounceSchedule(TimeToClock timeToClock){
           // No need to validate the schedule since it is already assumed to be valid thanks to the compiler.
        }
        

        你可以使用:

        public enum TimeToClock {
            NINE(9),
            NINE_AND_HALF(9.5f);
            // etc...
        
            TimeToClock(float schedule) {
                this.schedule = schedule;
            }
        
            public float getSchedule(){
                return schedule;
            }
        
            private float schedule;
        }
        

        顺便说一句,这两种方法都是有效的,这取决于你的上下文和目标。

        【讨论】:

          猜你喜欢
          • 2016-07-21
          • 2018-11-10
          • 2016-09-09
          • 2015-03-23
          • 2014-09-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多