Java:如果枚举常量本质上是静态的,那么枚举常量如何具有与其关联的构造函数和方法

时间:2019-01-27 18:35:42

标签: java methods enums static enumeration

枚举常量如何本质上是静态的,如何才能成为对象和访问方法并具有构造函数。

枚举常量如何同时是对象和静态对象

请参考以下代码:

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 :(得分:1)

Java文档:

枚举类型的构造函数必须是程序包私有或私有访问。它会自动创建在枚举主体开头定义的常量。您不能自己调用​​枚举构造函数。

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

其中的每一个都将在开头(当您执行Apple ap;时)以方括号中指定的价格调用构造函数。

枚举也可以有方法。您不仅限于简单的getter和setter方法。您还可以创建基于枚举常量的字段值进行计算的方法。如果您的字段未声明为final,则您甚至可以修改字段的值(不正确的做法,考虑到枚举应为常量)。

枚举实例是“静态的”(即,行为类似于静态变量),但不是不可变的-这是您问题的答案。更改枚举的字段会对每个人都更改(静态)。

优良作法是在枚举中将字段定型并使其不可变。

 private **final** int price;