【问题标题】:Java: How can enum constant can have a constructor and methods associated with it if it is static in natureJava:如果枚举常量本质上是静态的,那么枚举常量如何具有与其关联的构造函数和方法
【发布时间】:2024-04-15 10:05:02
【问题描述】:

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

枚举常量怎么可能是对象又是静态的呢

请参考以下代码:-

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

【问题讨论】:

  • “有一个构造函数”是什么意思?它们没有构造函数。
  • 有什么问题?你能指望什么?你的代码是如何工作的?你的代码在哪一行失败了?
  • 我不明白枚举常量如何可以是静态对象并且可以具有非静态成员。
  • @MiguelGarnachoVélez 他们确实有私有构造函数

标签: java methods enums static enumeration


【解决方案1】:

Java 文档:

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

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

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

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

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

在枚举中使字段最终化并使其不可变是一种很好的做法。

 private **final** int price;

【讨论】:

    最近更新 更多