对于应该在java中定义枚举的地方,是否存在“最佳实践”?
一个选项是为每个枚举设置一个单独的.java文件,任何使用该枚举的类都可以包含它。
示例:
Direction.java:
public enum Direction {
INPUT, OUTPUT, UNKNOWN
}
Type.java
public enum Type{
DATA, VALID, READY, UNKNOWN
}
另一个选择是在我的应用程序中包含一个包含所有枚举的大文件,如果一个类使用任何枚举,则必须包含该大文件。
示例:
MyEnums.java
public class MyEnums{
public enum Direction {
INPUT, OUTPUT, UNKNOWN
}
public enum Type{
DATA, VALID, READY, UNKNOWN
}
}
在性能和代码可移植性/可扩展性方面,两个选项中哪一个更好?或者这是一个选择问题,没有更好的选择?在Java中定义枚举的最佳方法是什么?
答案 0 :(得分:1)
基本上,如果您不打算公开枚举的用法,例如Direction
然后你就可以在正在使用它的类中做到。我的意思是你可以将其设为私有,例如:
public class Foo {
private Direction directionType = Direction.UNKNOWN;
// some code
private enum Direction {
INPUT, OUTPUT, UNKNOWN
}
}
在单独的*.java
文件中写入具有逻辑的枚举(如果有的话)。这绝对是一个很好的方法。以下示例是Oracle Guide:
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
答案 1 :(得分:0)
我看到的一般做法是为所有枚举提供一个包,每个枚举都在自己的java文件中,并包含该枚举的所有相关方法。如果您将要拥有的只是一堆枚举而没有使用枚举内容的方法,我想它只是归结为选择的问题。
想象一下常见的场景,其中每个枚举都有几个与它所持有的常量相关的方法。你可以看到在一个类中有几个枚举可以很容易地使代码变得笨拙。但另一方面,如果你只是要收集一些枚举词,为了简洁起见,甚至可能需要将它们放在一个地方。
就性能和可移植性而言,没有任何区别 - 您只需要考虑代码是否变得笨重。
答案 2 :(得分:0)
与任何其他类或接口相同。
这是枚举的事实并没有改变问题的基本性质。