25

为什么这个枚举在它自己的文件中声明。这有优势吗?另外我怎么能把它放在两个文件之一中。我真的不知道我在做什么。还请以简单的方式解释这一点,因为这是一个教科书示例,而且我对 Java 还很陌生。

ScaleName.java

enum ScaleName {celsius, fahrenheit, kelvin, rankine};

温度.java

class Temperature {

    private double number;
    private ScaleName scale;

    public Temperature() {
        number = 0.0;
        scale = ScaleName.fahrenheit;
    }

    public Temperature(double number) {
        this.number = number;
        scale = ScaleName.fahrenheit;
    }

    public Temperature(ScaleName scale) {
        number = 0.0;
        this.scale = scale;
    }

    public Temperature(double number, ScaleName scale) {
        this.number = number;
        this.scale = scale;
    }

    public void setNumber(double number) {
        this.number = number;
    }

    public double getNumber() {
        return number;
    }

    public void setScale(ScaleName scale) {
        this.scale = scale;
    }

    public ScaleName getScale() {
        return scale;
    }
}

使用温度.java

class Temperature {

    private double number;
    private ScaleName scale;

    public Temperature() {
        number = 0.0;
        scale = ScaleName.fahrenheit;
    }

    public Temperature(double number) {
        this.number = number;
        scale = ScaleName.fahrenheit;
    }

    public Temperature(ScaleName scale) {
        number = 0.0;
        this.scale = scale;
    }

    public Temperature(double number, ScaleName scale) {
        this.number = number;
        this.scale = scale;
    }

    public void setNumber(double number) {
        this.number = number;
    }

    public double getNumber() {
        return number;
    }

    public void setScale(ScaleName scale) {
        this.scale = scale;
    }

    public ScaleName getScale() {
        return scale;
    }
}
4

3 回答 3

33

为什么在 Java 中在单独的文件中声明枚举?

您不必在单独的文件声明。enum你可以这样做:

public class Temperature {
    public enum ScaleName {celsius, fahrenheit, kelvin, rankine};
    
    private double number;
    private ScaleName scale;

    public Temperature() {
        number = 0.0;
        scale = ScaleName.fahrenheit;
    }
    ...
}

这与使枚举成为顶级类之间的唯一区别是,当您在不同的类中使用枚举时,您现在需要限定枚举的名称。

但是在我的示例中发生的事情与枚举是任何其他静态嵌套类时发生的事情没有什么不同。(嵌套枚举是隐式静态的,因此我们不需要static关键字。请参阅JLS 8.9。)


为什么这个枚举在它自己的文件中声明。

因为代码作者选择了这种方式1 .

这有优势吗?

是的。这意味着不必限定enum使用它......在某些情况下,如果enum如上所述嵌套,则必须这样做。


实际上,Java 确实允许您将多个顶级类放入同一个源文件中,前提是除了其中一个类之外的所有类都是“包私有的”。但是,这样做通常被认为是不好的风格,并且对于某些工具链来说可能会有问题......我听说过。


1 - 如果您想知道代码作者选择这样做的真正原因,您需要询问他们!

于 2013-01-21T02:05:24.853 回答
18

枚举不仅仅是 Java 中的裸值,它们远不止这些。它们本身就是类(它们继承Object)。并考虑这些:

public enum Int {
    ONE(1),
    TWO(2);

    private final int value;

    Int(final int value) { this.value = value; }

    public int getValue() { return value; }

    @Override
    public String toString() { return "I am integer " + value; }
}

还要考虑:

public enum Operation
{
    PLUS
        {
            @Override
            public int calculate(final int i1, final int i2)
            {
                return i1 + i2; 
            }
        };

    public abstract int calculate(int i1, int i2);
}

final int ret = Operation.PLUS.calculate(2, 3);

你也可以将它们结合起来。它们是非常强大的工具。

于 2013-01-21T01:54:35.607 回答
5

Anenum是 aclass并且遵循相同的规则。

将它放在自己的文件中就像在单独的文件中移动内部类一样,不多也不少。所以是的,您可以将它移动到其中一个类中,并能够使用OuterClass.ScaleName语法从外部访问它。

于 2013-01-21T01:53:12.327 回答