簡體   English   中英

Java中的內部類和字符串文字

[英]Inner-Class and String Literals in Java

以下兩種情況似乎有效:

public class A {
    private class B {
        public static final String str = "str";
    }
}

public class A {
    private static class B {
        public static final String str = new String("str");
    }
}

但是以下給出了注釋中指定的錯誤:

public class A {    
    private class B {
    //The field str cannot be declared static; 
    //static fields can only be declared in static or top level types
        public static final String str = new String("str"); 
    }
}

為什么在前兩種情況下允許使用它,為什么在后一種情況下引起問題?

JLS第8.1.3節要求這樣做。 我從未見過這種情況的原因,但我懷疑不是靜態的內部類需要外部類的實例,但是聲明為靜態的類打破了該概念,並且通過允許它們將創建另外一組規則來處理只是這種情況,被認為是不值得的。 而當它是靜態的時,它實際上與任何其他類一樣恰好位於同一源文件中。

我猜測限制是由於如何實現new String("str")而引起的。 使用常量字符串初始化成員可以通過常量池中的條目來完成,但是new String("str")需要實際執行代碼,因此必須使用靜態init方法中的實際字節碼來完成。

復雜的內部類方案讓我很頭疼(這實際上是內部的麻煩),因此我無法確切解釋問題所在,但我懷疑在上述情況下,靜態init方法在不適當的時間運行,因此,結果要么不可靠,要么系統將無法處理由於靜態init方法中的錯誤而導致的異常。

JLS明確規定了這一限制; 見伊齋的答案。

關於“為什么”的一種可能解釋是,人們期望非恆定靜態初始化程序表達式可以引用封閉類中的靜態或非靜態。 第一種可能會導致類(靜態)初始化的順序出現概念上或實現上的困難。 第二個將無法實現,並會導致難以理解的編譯錯誤。 (考慮新手使用簡單方法多久嘗試一次靜態/非靜態訪問限制。)

我認為他們只是簡單地采取了這種做法,並禁止這樣做。 (KISS為我工作...)他們可能認為他們可以在以后的版本中放寬限制,但后來沒有看到這樣做的必要。

暫無
暫無

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

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