簡體   English   中英

為什么不從枚舉擴展<e extends enum<e> ></e>

[英]Why not extending from Enum<E extends Enum<E>>

我偶然發現了以下我無法從 class 擴展和實現的問題,它在 Java 1.5(java.lang 包)中定義

public abstract class Enum<E extends Enum<E>> {...
}..

我遇到的問題是創建我自己的具有不同序數值的枚舉類型。 我不想通過使用不同的序號名稱來實現它,比如 getCode() 等。所以我想我可以 go 擴展上面的 class 的方式。

public final class XYZ extends Enum<XYZ> { //Does not work.
  //
  A("A", 1),
  B("B", 7);
  .
}

我知道我可以做到以下幾點:

public enum NEWEnum {
   A(1),
   B(7);

   private int code;
   private NEWEnum(int code) {
     this.code = code;
   }
   public int getCode() {
     return this.code;
   }
}

我寧願在 Enum 中使用通常的命名方式,例如 ordinal() 和 name() 。

你不能像那樣擴展 Enum 。 它內置於編譯器或運行時(不確定是哪個)。

但是看起來您正在嘗試解決錯誤的問題; 枚舉值的序號不應該具有任何功能意義。 一旦你給它一個,它應該有一個不同於“Ordinal”的名字。 您的第二個代碼片段遠遠優於您的第一個代碼片段。

一般來說,任何事情都依賴序號是不好的做法; 它可能從一開始就不應該被曝光。 您唯一可以依賴的就是名稱,以及您自己分配的任何值。

如果將字段命名為“序號”對您來說很重要,只需使用類型安全的 枚舉模式(第 21 項) ,枚舉只是它的一個實現。

Enum 得到編譯器的特殊處理,像 EnumSet 這樣的類根據這種處理做出假設。 ordinal()name()這樣的枚舉方法的行為是嚴格定義的,自己實現它們來復制這種行為是沒有意義的。 此外,聲明枚舉值的語法僅在enum中有效,不會在class中編譯。

重要的是要記住,您永遠不應該自己使用ordinal() ,因此根據您的問題定義它是沒有意義的。

Enum class 在 Java 中是特殊的,因為它用於實現 Enum 語言功能。 因此,它不僅是 class,與 Java 中的任何其他 class 一樣,而且更特殊(如String ,其+運算符已重載,或如盒裝類)。 為了使這些功能起作用,需要對枚舉有特殊要求(比如,我猜,連續的序數)。 因此 Java 語言規范明確禁止手動繼承Enum class。

枚舉在語言核心和特殊用途中具有特殊含義。 因此,您可以在switch語句中使用它們,這對於普通類來說是不可能的。

例如,如果您顯式實現它,則不必在構造函數中初始化“name”和“ordinal”屬性。 以后可能會導致NPE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM