哪里最好定义枚举java?

时间:2014-12-08 23:51:40

标签: java enums

对于应该在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中定义枚举的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

基本上,如果您不打算公开枚举的用法,例如Direction然后你就可以在正在使用它的类中做到。我的意思是你可以将其设为私有,例如:

1作为内部类型(直接使用)

public class Foo {

    private Direction directionType = Direction.UNKNOWN;

    // some code

    private enum Direction {
        INPUT, OUTPUT, UNKNOWN
    }
}

2作为外部类型

在单独的*.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)

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

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