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

2022-09-01 16:50:59

为什么此枚举在其自己的文件中声明。这有什么好处吗?另外,我如何能够将其放入2个文件之一中。我真的不知道我在做什么。也请用一个简单的方式来解释这一点,因为这是一个教科书的例子,而且我对Java还很陌生。

规模名称.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;
    }
}

答案 1

为什么在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;
    }
    ...
}

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

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


为什么此枚举在其自己的文件中声明。

因为代码作者选择以这种方式执行此操作1.

这有什么好处吗?

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


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


1 - 如果你想知道教科书的作者选择这样做的真正原因,你需要问他们!


答案 2

枚举不仅仅是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);

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