enum需要其功能时使用。 不要 严格 避免它 。
Java枚举功能更强大,但是如果您不需要其功能,可以使用常量,它们会占用较少的空间,并且它们本身可以是原始的。
何时使用枚举:
- 类型检查-你可以接受 只 列出的值,而且他们是不连续的(见下面就是我所说的 连续 点击这里)
方法重载-每个枚举常量都有自己的方法实现
public enum UnitConverter{METERS{ @Override public double toMiles(final double meters){ return meters * 0.00062137D; } @Override public double toMeters(final double meters){ return meters; }},MILES{ @Override public double toMiles(final double miles){ return miles; } @Override public double toMeters(final double miles){ return miles / 0.00062137D; }};public abstract double toMiles(double unit);public abstract double toMeters(double unit);}
更多数据-您的一个常数包含多个不能放在一个变量中的信息
复杂的数据-您不断需要的方法来处理数据
何时 不 使用枚举:
- 您可以接受一种类型的所有值,并且您的常数仅包含这些最常用的值
您可以接受连续数据
public class Month{public static final int JANUARY = 1;public static final int FEBRUARY = 2;public static final int MARCH = 3;...public static String getName(final int month){ if(month <= 0 || month > 12){ throw new IllegalArgumentException("Invalid month number: " + month); } ...}}
用于名称(例如您的示例)
- 对于真的不需要枚举的其他所有内容
枚举占用更多空间
- 枚举常量的单个引用占用 4个字节
- 每个枚举常量占用的空间是 其字段大小 的 总和, 对齐方式是8字节+ 对象的开销
- 枚举类本身占用一些空间
常量占用更少的空间
- 常量没有引用,因此它是纯数据(即使是引用,枚举实例也将是对另一个引用的引用)
- 常量可以添加到现有类中-不必添加其他类
- 常量可以内联;它带来了扩展的编译时功能(例如,空检查,查找无效代码等)



