代碼風格很差,但有時不可避免。這是一個極端的例子。所以Java:限制嵌套類?
- 是否有一些嵌套類的限制?
- 它們是否等同?
- 你如何處理這種情況?創建圖書館?
代碼
new FileObject().new Format().new Words().new Some().new Continue someThing;
((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing;
代碼風格很差,但有時不可避免。這是一個極端的例子。所以Java:限制嵌套類?
代碼
new FileObject().new Format().new Words().new Some().new Continue someThing;
((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing;
代碼風格很差,但有時不可避免。
該聲明的第二部分顯然是虛假的。始終可以避免在實現級別使用嵌套類。
我能想到不明智設計理由嵌套命名類多個級別,和匿名類超過3或4級。 (我記得使用在非常複雜的回調Eclipse RCP應用程序3或4級匿名內部類的一次。但是,這是真的不正常了,現在回想起來,這是一個壞主意。)
1)嵌套類有一些限制嗎?
理論上,限制是對完全限定類名的64K限制。在實踐中,限制是常識。
2)它們是否相等?
他們?如果您問嵌套類是否與非嵌套類相同,那麼對所有實際意圖而言,答案都是肯定的。你可以用嵌套類做的唯一事情是你不能用常規類來做的事情,那就是共享聲明爲private
的東西。解決方法是放鬆您對私人包的訪問。
3)你如何處理這種情況?創建圖書館?
我不知道你在說什麼情況。模塊化由多個類組成的Java程序的正常方式是使用Java包而不是類嵌套。這是你所缺少的嗎?
你給的例子都是非靜態內部類。 (您需要一個包含類的對象來實例化嵌套類。)很少使用嵌套的非靜態類。通常,您可以使用靜態嵌套類或具有默認(包)範圍的非嵌套類。
在字節碼級別,不存在嵌套類的事情 - 編譯器將它們變成單獨的頂級類,它們可以通過綜合訪問器方法訪問父類的方法。
嵌套深度沒有明確限制。最相關的隱式限制是生成的.class文件的名稱,該文件複製包含層次結構,即FileObject$Format$Words$Some$Continue.class
。這將最終運行到文件名長度限制,這取決於文件系統。
好的答案,但我認爲訪問器方法只有在嵌套類中的方法不是包私有時纔會創建。 – helpermethod 2010-05-02 09:53:18
@helpermethod - 這是不正確的。訪問沒有區別。也許你正在考慮「靜態」。 – 2014-10-30 13:19:49
在Inner Classes and Enclosing Instances(在langage規範中)中,嵌套類是一種靜態內部類。
所以我想你的情況是內在的,不是嵌套的。因爲我不喜歡新的Toto()。new Foo()...你獲得一個foo對象,但是toto對象在哪裏?
對於嵌套,我做了新的Toto.Foo.Bar.Other.And.So.On()。
太陽JVM具有65536個字節 編碼爲使用字符串一個完全限定類名 限制改性 UTF-8如在「類文件 格式」規範說明。它來自'u2' 容量(16位) - 來自常量池'CONSTANT_Utf8_info'結構的'長度'的類型 用於存儲類 文件中的類名稱。
從maximum length for a java class name
此外,罐子格式(基於ZIP)具有最大文件名長度也64K。 (Wikipedia, ZIP, File headers)
因此,類嵌套的限制是當名稱達到64k時,但我認爲您的理智可能在此之前就已達到極限!
我的意思是說文件名的長度,這就是問題實質上是什麼 - 類名可以多久。 zip格式將文件名限制爲64k(不包括文件內容)。 – mdma 2014-10-30 20:10:13
它總是可以避免的 – Bozho 2010-05-02 08:39:46
這是否提供的代碼在語法上是正確的? – nmr 2012-02-15 00:14:37
在某些代碼生成環境中這是不可避免的。在設計不佳的模式文件中使用Jaxb時,我碰到了深度限制(幸運的是,我可以編輯它)。 – Spina 2012-08-15 14:06:28