簡體   English   中英

從什么時候開始枚舉構造函數的默認訪問修飾符是私有的?

[英]Since when have enum constructors' default access modifier been private?

枚舉構造函數的默認訪問修飾符“私有”多久了? 從一開始還是在 Java 8 中發生了變化? 如果是這樣,那么沒有訪問修飾符的構造函數聲明的默認訪問修飾符是什么? (我猜它是默認的(包可訪問),就像其他 java 類的構造函數一樣。)

我找到了一些與此相關的參考文件,但找不到確切的答案。 這是我發現的,

  1. Java8 JLS 8.9.2 ,在枚舉聲明中,沒有訪問修飾符的構造函數聲明是私有的。
  2. Java7 JLS 8.9.2 ,如果枚舉類型沒有構造函數聲明,則自動提供不帶參數的私有構造函數(以匹配隱式空參數列表)。

從什么時候枚舉構造函數的默認訪問修飾符為“私有”?

總是。 你不能創建新的枚舉,這就是它們的重點。 您不能擁有枚舉的非私有構造函數(使用來自 openjdk16 的 javac):

> cat Test.java
public enum Test {
  FOO, BAR;
  public Test() {}
}
> javac Test.java
Test.java:3: error: modifier public not allowed here

讓我們試試 java6(是的,我有 javac6,可以在新的 javas 上運行它)。

> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
Test.java:3: error: modifier public not allowed here

所以,這個錯誤在 2 年里沒有改變。

讓我們檢查一下javac6中的訪問級別!

> cat Test.java
public enum Test {
    FOO, BAR;
    Test() {}
}
> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
> javap -c -private Test
.... lots of decompiled bytecode

private Test();
    Code:
       0: aload_0
       1: aload_1
       2: iload_2
       3: invokespecial #18                 // Method java/lang/Enum."<init>":(Ljava/lang/String;I)V
       6: return

... more decompiled bytecode

因此,私人。 一直是,永遠都是。 這就像在問:“圓圈有角嗎?”。

答案是:不。永遠不會。 如果一個圓有一個角,它就不再是一個。 具有公共構造函數的枚舉不是枚舉。

暫無
暫無

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

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