0

I'm learning Java from the book "The Java Tutorial" 6th edition. There is an example with Enum class types which is the following:

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

The problem is that I haven't understood the purpose of the lines:

private double mass() { return mass; }
private double radius() { return radius; }
Afe
  • 167
  • 1
  • 10
  • 5
    I think they meant to return the values of mass and radius but make those 2 methods to public so that they can be accessed from outside the class also. – Prudhvi Mar 07 '15 at 20:59
  • possible duplicate of http://stackoverflow.com/questions/8983709/why-would-you-declare-getters-and-setters-method-private – Melika Barzegaran Mar 07 '15 at 20:59
  • See [this question](http://stackoverflow.com/questions/1568091/why-use-getters-and-setters) for a lot of general discussion on Setters and Getters (those lines are Getters, specifically). In this case I believe you have a typo, every time I've ever seen this tutorial they're public, and the fact they're never used internally suggests that as well. But @MelikaBarzegaranHosseini's possible duplicate offers some arguments for making private getters/setters. – aruisdante Mar 07 '15 at 21:03
  • 1
    Are you confused about why the methods are private, or the fact that enums can have fields? – Patrick Mar 07 '15 at 21:04

2 Answers2

2

I don't see any specific purpose of those two methods unless they're defined using public access modifier because you can use the two fields mass and radius in other methods. Even eclipse showed warnings on those 2 methods and suggested to remove them because they were never used locally. Even if you use those two methods locally(inside the enum) their purpose is not specific and the same can be achieved by using the private fields available. But as I said in my comment, make the two methods public if you want to access them outside your enum. Take a look at the screenshot below.

Eclipse Warnings

I have a question for you. I don't understand the purpose of main method inside the enum.

Prudhvi
  • 2,276
  • 7
  • 34
  • 54
  • `I don't understand the purpose of main method inside the enum.` General bad convention for testing. I have a teacher that puts all his testing in the corresponding class within a `main` method. Don't like that class anymore. – Obicere Mar 07 '15 at 21:47
  • 1
    @Obicere this code came from Oracle Java [Enum Tutorial](http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). This is frequently done to run code in isolation. I agree, it is not a good practice for real applications. – hfontanez Mar 09 '15 at 14:37
1

The purpose of the mass() and radius() methods is to retrieve the property from each Enum type in order to calculate a Planet surface gravity. They are made private in order to prevent access to these immutable (final) properties.

The Enum encapsulates these properties, but allows you to obtain each enumerated Planet's surface gravity as a calculated value derived from these private attributes.

UPDATE: I forgot to mention that in this example, they are not used.

hfontanez
  • 5,774
  • 2
  • 25
  • 37