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

Java: How can enum constant can have a constructor and methods associated with it if it is static in nature

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

枚举常量如何既是对象又是静态的

请参考以下代码:-

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

Java 文件:

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

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

这些中的每一个都会在开始时(当您执行 Apple ap; 时)调用构造函数,价格如括号中所述,仅此而已。

枚举也可以有方法。您不限于简单的 getter 和 setter 方法。您还可以创建根据枚举常量的字段值进行计算的方法。如果您的字段未声明为最终的,您甚至可以修改字段的值(不好的做法,考虑到枚举应该是常量)。

枚举实例是 "static"(即表现得像静态变量),但不是不可变的 - 这就是您问题的答案。更改枚举的字段会为每个人更改它(静态)。

将您的字段设置为枚举中的最终字段并使其不可变是一种很好的做法。

 private **final** int price;