Можно ли использовать перечисление как класс? - PullRequest
0 голосов
/ 03 августа 2020

Я читал Java Oracle Учебники и видел пример использования перечисления:


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

Я всегда думал, что перечисления - это наборы связанных константы, которые обычно использовались вне класса, но в этом примере показано, как enum используется, как если бы это был класс, со своими собственными методами и конструкторами. Я знаю, что это перечисление из-за «перечисления» в объявлении класса. Можно ли использовать перечисление как класс? В чем разница между классом и перечислением, если они так похожи? Какие хорошие варианты использования перечислений, которые действуют как стандартный класс?

Спасибо

Ответы [ 4 ]

2 голосов
/ 03 августа 2020

Класс enum очень похож на обычный класс, за исключением того, что экземпляры определяются во время компиляции и гарантированно являются одиночными extend и не могут *1002* ничего.

Однако они могут:

  • имеют поля экземпляра, которые могут быть окончательными или нет (хотя при обычном использовании они неизменяемы, это не требуется)
  • имеют поля класса (static) (хотя они должны быть объявлено после экземпляров)
  • иметь геттеры / сеттеры для полей
  • иметь конструкторы (только не publi c один)
  • реализовывать интерфейсы
  • быть украшен аннотациями
0 голосов
/ 03 августа 2020

Ключевое слово enum - это языковая конструкция, которая по сути создает (последний) класс, который расширяет java.lang.Enum и заставляет вас заранее определить (возможно, пустой) набор всех именованных экземпляров внутри определения перечисления. Так что ответ определенно да; на самом деле, вы не можете использовать его по-другому.

Даже если вы не добавите к нему никаких logi c, он все равно будет классом:

enum Day { SUNDAY, MONDAY... }

Это уже предоставляет вам методы c, такие как Day.valueOf(), и методы экземпляра, такие как Day.SUNDAY.ordinal(), name() или compareTo().

0 голосов
/ 03 августа 2020

Если вы хотите использовать enum как класс, вы можете использовать его следующим образом.

public class Weather {

     public enum Season {
         WINTER,
         SPRING,
         SUMMER,
         FALL
     }
     private final Season season;

     private static final List < Weather > listWeather = new ArrayList < Weather > ();

     private Weather(Season season) {
         this.season = season;
     }

     public Season getSeason() {
         return season;
     }

     static {

         for (Season season: Season.values()) {
             listWeather.add(new Weather(season));
         }
     }

     public static ArrayList < Weather > getWeatherList() {
         return listWeather;
     }
     public String toString() {
         return season;
     }
 }
0 голосов
/ 03 августа 2020

Основное различие между перечислением и стандартным классом заключается в ограничениях: все экземпляры перечисления должны быть объявлены во время компиляции; все поля должны быть окончательными, и класс не может быть расширен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...