【问题标题】:Enum types Java枚举类型 Java
【发布时间】:2015-03-07 20:54:21
【问题描述】:

我正在从《Java 教程》第 6 版一书中学习 Java。 有一个 Enum 类类型的示例,如下所示:

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));
    }
}

问题是我没有理解这些行的目的:

private double mass() { return mass; }
private double radius() { return radius; }

【问题讨论】:

  • 我认为他们的意思是返回质量和半径的值,但将这两种方法公开,以便也可以从类外部访问它们。
  • 请参阅this question,了解有关 Setters 和 Getters 的大量一般性讨论(这些行特别是 Getters)。在这种情况下,我相信您有一个错字,每次我看到本教程时它们都是公开的,而且它们从未在内部使用过这一事实也表明了这一点。但是@MelikaBarzegaranHosseini 的可能重复提供了一些关于制作私有 getter/setter 的论据。
  • 你是否对为什么方法是私有的,或者枚举可以有字段的事实感到困惑?

标签: java class enums


【解决方案1】:

除非使用public 访问修饰符定义它们,否则我看不到这两种方法的任何特定用途,因为您可以在其他方法中使用质量和半径这两个字段。甚至 eclipse 也对这两种方法显示警告并建议删除它们,因为它们从未在本地使用过。即使您在本地(在枚举内部)使用这两种方法,它们的目的也不是特定的,也可以通过使用可用的私有字段来实现。但正如我在评论中所说,如果您想在枚举之外访问这两种方法,请将它们公开。看看下面的截图。

我有一个问题要问你。我不明白枚举中 main 方法的用途。

【讨论】:

  • I don't understand the purpose of main method inside the enum. 测试的一般错误约定。我有一位老师将他所有的测试放在main 方法中的相应课程中。不再喜欢那门课了。
  • @Obicere 此代码来自 Oracle Java Enum Tutorial。经常这样做是为了单独运行代码。我同意,这对于实际应用来说不是一个好习惯。
【解决方案2】:

mass()radius() 方法的目的是从每个Enum 类型中检索属性,以便计算Planet 表面重力。将它们设为private 是为了防止访问这些不可变(最终)属性。

Enum 封装了这些属性,但允许您将每个枚举行星的表面重力作为从这些私有属性派生的计算值获得。

更新:我忘了提到在这个例子中,它们没有被使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2017-01-14
    相关资源
    最近更新 更多