【问题标题】:Why is an enum declared in a separate file, in Java?为什么在 Java 中的单独文件中声明枚举?
【发布时间】:2013-01-04 02:01:55
【问题描述】:

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

ScaleName.java

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

Temperature.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;
    }
}

UseTemperature.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 enums


【解决方案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;
    }
    ...
}

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

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


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

因为代码作者选择这样做1.

这样做有什么好处吗?

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


实际上,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);
    

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

    【讨论】:

    • 我相信这是一个很好的答案,并且对于比我更高级的人来说是有意义的。但是,您的代码比我迄今为止所知道的语法要复杂得多。我在学习,不是专家。
    • 你同样可以使用简单的枚举:public enum Const { VALUE1, VALUE2 }。但问题是,它们是类(有一些特殊性),所以它们被这样使用;)
    • 这没有回答所提出的问题。
    【解决方案3】:

    enumclass 并遵循相同的规定。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多