Java: Каким образом константа перечисления может иметь конструктор и методы, связанные с ним, если она статична по своей природе - PullRequest
0 голосов
/ 27 января 2019

Каким образом константа-перечисление может быть объектом и методами доступа и иметь конструктор, если он статичен по своей природе.

Как константа перечисления может быть объектом и быть статичной одновременно

Пожалуйста, используйте код ниже: -

enum Apple {
   Jonathan(10), GoldenDel(9), RedDel, Winesap(15), Cortland(8);

   private int price; // price of each apple

   // Constructor
   Apple(int p) { 
      System.out.println("Price: " + p);
      price = p; 
   }

   // default constructor, constructor overloading
   Apple() {
      price = -1;
      System.out.println("Price: " + price);
   }

   int getPrice() { return price; }
}

class EnumDemo3 {
   public static void main(String args[]) {
       Apple ap;

       // Display price of Winesap.
       System.out.println("Winesap costs " + Apple.Winesap.getPrice() + " cents.\n");

       // Display all apples and prices.
       System.out.println("All apple prices:");
       for(Apple a : Apple.values())
           System.out.println(a + " costs " + a.getPrice() + " cents.");
   }
}

1 Ответ

0 голосов
/ 27 января 2019

Java doc:

Конструктор для типа enum должен иметь частный или частный доступ к пакету.Он автоматически создает константы, которые определены в начале тела enum.Вы не можете вызвать конструктор enum самостоятельно.

Jonathan(10), GoldenDel(9), RedDel, Winesap(15), Cortland(8);

Каждый из них будет вызывать конструктор в начале (когда вы выполняете Apple ap;) с ценой, указанной в скобках, не более того.

Enum также может иметь методы.Вы не ограничены простыми методами получения и установки.Вы также можете создавать методы, которые производят вычисления на основе значений полей константы перечисления.Если ваши поля не объявлены как окончательные, вы можете даже изменить значения полей (плохая практика, учитывая, что перечисления должны быть константами).

Экземпляры Enum являются "статическими" (т.е. ведут себя как статические переменные), но не являются неизменяемыми - , что является ответом на ваш вопрос .Изменение поля перечисления меняет его для всех (статическое).

Хорошей практикой является сделать ваши поля окончательными в перечислении и сделать их неизменяемыми.

 private **final** int price;
...