【问题标题】:more enum in interface接口中的更多枚举
【发布时间】:2014-10-05 19:58:23
【问题描述】:

检查这个例子:

public interface IConstants {

    public enum Levels {
        LOW("30 points"), MEDIUM("50 points")

    };

    public enum Cars {
        PORSCHE("250 km/h"), FORD("180 km/h")
    }

}

我想要一个这样的界面,因为我想以这种方式访问​​我的枚举:

    String level = IConstants.Levels.MEDIUM;
    String car = IConstants.Cars.PORSCHE;

编译器显示此消息:

构造函数 IConstants.“枚举名称”未定义。

这样解决了:

 public class Constants {

        public static class Levels {
            public static String LOW = "30 points"; 
            public static String MEDIUM = "50 points";
        };

//... other classes

    }

-在(我的情况)我的常量中有一个“树”对我很有用,每个常量都以关键字常量开始,然后是子类别,然后是值 -> Constants.Levels.LOW。 //如果这是非常糟糕的做法,请批评它,我同意所有 cmets - 另一件可能是好事,一个类中会有所有常量

【问题讨论】:

  • 这是Constant Interface Antipattern。不要这样做。
  • 好的,所以我应该在类而不是接口中声明我的所有常量?公共最终类常量 {...} ??
  • 为什么要将enum 声明为嵌套类?你有什么收获?
  • Levels.MEDIUM 有什么问题?我不确定您是否了解自己想要什么或想要实现什么。请先阅读the Oracle tutorial on enum
  • 懒惰绝不是糟糕的编程实践的借口。当然应该很明显,很多人和你的想法完全相同,然后 Java 社区的大多数人认为成本超过了收益。从别人的错误中吸取教训,否则你注定要重蹈覆辙。

标签: java enums


【解决方案1】:

就像蜘蛛 Boris 在评论中告诉你的那样,在接口中声明常量是一种反模式。但是,您的问题来自这样一个事实,即您将 String 传递给枚举的任何实例,但您没有为此声明构造函数

public enum Levels {
    LOW("30 points"), MEDIUM("50 points")

    private final String pts;
    private Levels(String pts) {
       this.pts = pts;
    }

    public String getPoints() {
       return pts;
    }

};

这应该可行。

【讨论】:

  • 我解决它的方法是不是很糟糕? (见编辑后的帖子),谢谢
  • @CharlieHarper 不,你解决它的方法不是坏习惯,但你也应该使 Level 类最终并使用静态导入。
  • @CharlieHarper 现在更好了,因为您不再使用接口作为常量的容器。您还可以将枚举留在具有私有构造函数的类中。老实说,我更喜欢枚举来保存常量,但你的选择没有错
  • @msrd0 是的,我知道我忘了在类中添加 final 关键字,谢谢大家。
【解决方案2】:

您在两个枚举中都缺少构造函数。需要私有变量和构造函数,例如

public enum Levels {
     private String name;
     public Levels(String name) {
          this.name = name;
     } 
}

将内部类、常量放在接口中也被认为是不好的做法。

【讨论】:

  • 我解决它的方法是不是很糟糕? (见编辑后的帖子),谢谢
【解决方案3】:

要添加到其他答案,在添加枚举构造函数后它仍然不会编译,因为您将 String 变量分配给 LevelsCars。请使用:

String level = IConstants.Levels.MEDIUM.methodToAccessString();
String car = IConstants.Cars.PORSCHE.methodToAccessString();

当然,将methodToAccessString() 替换为您所称的任何名称。

【讨论】:

  • 我解决它的方法是不是很糟糕? (见编辑后的帖子),谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多