其中最好定义枚举 Java



在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 文件中,其中包含该枚举的所有相关方法。如果你所拥有的只是一堆枚举,没有方法对枚举的内容进行操作,我想它只是归结为一个选择问题。

想象一下常见的场景,每个枚举都有几个与其持有的常量关联的方法。您可以看到,在单个类中具有多个枚举很容易使代码变得笨拙。但另一方面,如果您只是要收集枚举,为了简洁起见,甚至可能需要将它们全部放在一个地方。

就性能和可移植性而言,没有区别 - 您只需要考虑代码是否变得笨拙。

与任何其他类或接口相同。

它是一个枚举的事实并没有改变问题的基本性质。

最新更新