在java中定义枚举的位置是否有"最佳实践"?
一种选择是为每个枚举提供一个单独的.java文件,使用该枚举的任何类都可以包含它。
例:
方向.java:
public enum Direction {
INPUT, OUTPUT, UNKNOWN
}
类型.java
public enum Type{
DATA, VALID, READY, UNKNOWN
}
另一种选择是在我的应用程序中有一个包含所有枚举的大文件,如果一个类使用任何枚举,它必须包含该大文件。
例:
我的.java
public class MyEnums{
public enum Direction {
INPUT, OUTPUT, UNKNOWN
}
public enum Type{
DATA, VALID, READY, UNKNOWN
}
}
在性能和代码可移植性/可扩展性方面,这两个选项中哪一个更好? 还是选择问题,没有更好的选择?在 Java 中定义枚举的最佳方法是什么?
如果您不打算公开枚举的用法,例如 Direction
,那么你可以在使用它的类中做到这一点。我的意思是你可以把它设为私有,例如:
1 作为内部类型(直接使用)
public class Foo {
private Direction directionType = Direction.UNKNOWN;
// some code
private enum Direction {
INPUT, OUTPUT, UNKNOWN
}
}
2 作为外部类型
在单独的*.java
文件中写入带有逻辑的枚举(如果有的话)。这绝对是好方法。下面的示例是 Oracle 指南中的经典示例:
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }
// universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
double surfaceGravity() {
return G * mass / (radius * radius);
}
double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Usage: java Planet <earth_weight>");
System.exit(-1);
}
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}
总结
这实际上取决于上下文和体系结构决策。基本上,将枚举分组到一个java
文件中并不是最好的解决方案,尤其是当您的应用程序开始"增长"时。对于将要处理它的其他开发人员来说,代码将很难阅读。我建议使用方法#1或#2
我看到的一般做法是为所有枚举提供一个包,并且每个枚举都在自己的 java 文件中,其中包含该枚举的所有相关方法。如果你所拥有的只是一堆枚举,没有方法对枚举的内容进行操作,我想它只是归结为一个选择问题。
想象一下常见的场景,每个枚举都有几个与其持有的常量关联的方法。您可以看到,在单个类中具有多个枚举很容易使代码变得笨拙。但另一方面,如果您只是要收集枚举,为了简洁起见,甚至可能需要将它们全部放在一个地方。
就性能和可移植性而言,没有区别 - 您只需要考虑代码是否变得笨拙。
与任何其他类或接口相同。
它是一个枚举的事实并没有改变问题的基本性质。