6

代碼風格很差,但有時不可避免。這是一個極端的例子。所以Java:限制嵌套類?

  1. 是否有一些嵌套類的限制?
  2. 它們是否等同?
  3. 你如何處理這種情況?創建圖書館?

代碼

new FileObject().new Format().new Words().new Some().new Continue someThing; 

((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing; 
+6

它總是可以避免的 – Bozho 2010-05-02 08:39:46

+1

這是否提供的代碼在語法上是正確的? – nmr 2012-02-15 00:14:37

+0

在某些代碼生成環境中這是不可避免的。在設計不佳的模式文件中使用Jaxb時,我碰到了深度限制(幸運的是,我可以編輯它)。 – Spina 2012-08-15 14:06:28

回答

5

代碼風格很差,但有時不可避免。

該聲明的第二部分顯然是虛假的。始終可以避免在實現級別使用嵌套類。

我能想到不明智設計理由嵌套命名類多個級別,和匿名類超過3或4級。 (我記得使用在非常複雜的回調Eclipse RCP應用程序3或4級匿名內部類的一次。但是,這是真的不正常了,現在回想起來,這是一個壞主意。)

1)嵌套類有一些限制嗎?

理論上,限制是對完全限定類名的64K限制。在實踐中,限制是常識。

2)它們是否相等?

他們?如果您問嵌套類是否與非嵌套類相同,那麼對所有實際意圖而言,答案都是肯定的。你可以用嵌套類做的唯一事情是你不能用常規類來做的事情,那就是共享聲明爲private的東西。解決方法是放鬆您對私人包的訪問。

3)你如何處理這種情況?創建圖書館?

我不知道你在說什麼情況。模塊化由多個類組成的Java程序的正常方式是使用Java包而不是類嵌套。這是你所缺少的嗎?

3

你給的例子都是非靜態內部類。 (您需要一個包含類的對象來實例化嵌套類。)很少使用嵌套的非靜態類。通常,您可以使用靜態嵌套類或具有默認(包)範圍的非嵌套類。

4

在字節碼級別,不存在嵌套類的事情 - 編譯器將它們變成單獨的頂級類,它們可以通過綜合訪問器方法訪問父類的方法。

嵌套深度沒有明確限制。最相關的隱式限制是生成的.class文件的名稱,該文件複製包含層次結構,即FileObject$Format$Words$Some$Continue.class。這將最終運行到文件名長度限制,這取決於文件系統。

+0

好的答案,但我認爲訪問器方法只有在嵌套類中的方法不是包私有時纔會創建。 – helpermethod 2010-05-02 09:53:18

+0

@helpermethod - 這是不正確的。訪問沒有區別。也許你正在考慮「靜態」。 – 2014-10-30 13:19:49

2

Inner Classes and Enclosing Instances(在langage規範中)中,嵌套類是一種靜態內部類。

所以我想你的情況是內在的,不是嵌套的。因爲我不喜歡新的Toto()。new Foo()...你獲得一個foo對象,但是toto對象在哪裏?

對於嵌套,我做了新的Toto.Foo.Bar.Other.And.So.On()。

5

太陽JVM具有65536個字節 編碼爲使用字符串一個完全限定類名 限制改性 UTF-8如在「類文件 格式」規範說明。它來自'u2' 容量(16位) - 來自常量池'CONSTANT_Utf8_info'結構的'長度'的類型 用於存儲類 文件中的類名稱。

maximum length for a java class name

此外,罐子格式(基於ZIP)具有最大文件名長度也64K。 (Wikipedia, ZIP, File headers

因此,類嵌套的限制是當名稱達到64k時,但我認爲您的理智可能在此之前就已達到極限!

+0

我的意思是說文件名的長度,這就是問題實質上是什麼 - 類名可以多久。 zip格式將文件名限制爲64k(不包括文件內容)。 – mdma 2014-10-30 20:10:13