单例嵌套 ios_嵌套类型的前5个用例
單例嵌套 ios
前幾天,關于reddit進行了有趣的討論,即靜態內部類。 什么時候太多?
首先,讓我們回顧一下Java的基本歷史知識。 Java語言提供了四個級別的嵌套類 ,通過“ Java語言”,我的意思是這些構造僅是“語法糖”。 它們在僅了解普通類的JVM中不存在。
(靜態)嵌套類
在這種情況下, Inner完全獨立于Outer ,除了公共的共享名稱空間。
內部班
class Outer {class Inner {} }在這種情況下, Inner實例對其所在的Outer實例具有隱式引用。 換句話說,沒有關聯的Outer實例就不會有Inner實例。
創建此類實例的Java方法如下:
Outer.Inner yikes = new Outer().new Inner();看起來很尷尬的東西很有道理。 考慮在Outer內部的某個地方創建Inner實例:
class Outer {class Inner {}void somewhereInside() {// We're already in the scope of Outer.// We don't have to qualify Inner explicitly.Inner aaahOK;// This is what we're used to writing.aaahOK = new Inner();// As all other locally scoped methods, we can// access the Inner constructor by // dereferencing it from "this". We just// hardly ever write "this"aaahOK = this.new Inner();} }請注意,與public或abstract關鍵字非常相似, static關鍵字對于嵌套接口是隱式的。 乍看之下,以下假設語法可能很熟悉……:
class Outer {<non-static> interface Inner {default void doSomething() {Outer.this.doSomething();}}void doSomething() {} }……不可能寫上面的東西。 除了缺少<non-static>關鍵字外,似乎沒有任何明顯的理由解釋為什么“內部接口”不可行。 我懷疑這是通常的情況–必須有一些與向后兼容和/或多重繼承有關的邊緣案例警告,可以防止這種情況。
本地班
class Outer {void somewhereInside() {class Inner {}} }本地類可能是Java中鮮為人知的功能之一,因為它們幾乎沒有用處。 本地類是命名類型,其范圍僅擴展到封閉方法。 顯而易見的用例是您想在該方法中多次重用這種類型,例如在JavaFX應用程序中構造多個類似的偵聽器。
匿名班
class Outer {Serializable dummy = new Serializable() {}; }匿名類是僅具有一個實例的另一種類型的子類型。
嵌套類的前5個用例
如果未在靜態上下文中定義,則所有匿名類,本地類和內部類都保留對其封閉實例的引用。 如果讓這些類的實例泄漏到它們的范圍之外,可能會造成很多麻煩。 在我們的文章中閱讀有關該麻煩的更多信息: 不要聰明:Double Curly Braces Anti Pattern 。
但是,通常您確實希望從該封閉實例中獲利。 擁有某種可以在不公開實際實現的情況下返回的“消息”對象可能非常有用:
class Outer {// This implementation is private ...private class Inner implements Message {@Overridepublic void getMessage() {Outer.this.someoneCalledMe();}}// ... but we can return it, being of// type MessageMessage hello() {return new Inner();}void someoneCalledMe() {} }但是,對于(靜態)嵌套類,沒有封閉范圍,因為Inner實例完全獨立于任何Outer實例。 那么,使用這樣的嵌套類而不是頂級類型有什么意義呢?
1.與外部類型的關聯
如果您想與全世界進行交流,嘿,這個(內部)類型與這個(外部)類型完全相關,并且單獨使用沒有意義,那么您可以嵌套這些類型。 例如,這是通過Map和Map.Entry完成的:
public interface Map<K, V> {interface Entry<K, V> {} }2.從外部隱藏外部
如果包(默認)可見性還不足以滿足您的類型,則可以創建private static類,這些private static類僅對其封裝類型和該封裝類型的所有其他嵌套類型可用。 這實際上是靜態嵌套類的主要用例。
class Outer {private static class Inner {} }class Outer2 {Outer.Inner nope; }3.保護類型
這確實是一個非常罕見的用例,但是有時,在類層次結構中,您需要只希望對給定類型的子類型可用的類型。 這是protected static類的用例:
class Parent {protected static class OnlySubtypesCanSeeMe {}protected OnlySubtypesCanSeeMe someMethod() {return new OnlySubtypesCanSeeMe();} }class Child extends Parent {OnlySubtypesCanSeeMe wow = someMethod(); }4.模擬模塊
與Ceylon不同,Java沒有一流的模塊 。 使用Maven或OSGi,可以向Java的構建(Maven)或運行時(OSGi)環境中添加一些模塊化行為,但是如果要用代碼表示模塊,則實際上是不可能的。
但是,您可以使用靜態嵌套類按照約定建立模塊。 讓我們看一下java.util.stream包。 我們可以將其視為一個模塊,在此模塊中,我們有幾個“子模塊”或類型組,例如內部java.util.stream.Nodes類,大致類似于:
final class Nodes {private Nodes() {}private static abstract class AbstractConcNode {}static final class ConcNode {static final class OfInt {}static final class OfLong {}}private static final class FixedNodeBuilder {}// ... }所有java.util.stream包都可以使用其中一些Nodes東西,因此我們可以說,編寫方式有類似以下內容:
- 合成的java.util.stream.nodes子包,僅對java.util.stream “模塊”可見
- 幾個java.util.stream.nodes.*類型,也僅對java.util.stream “模塊”可見
- 合成java.util.stream.nodes包中的幾個“頂級”函數(靜態方法)
對我來說看起來很像錫蘭!
5.外觀原因
最后一點很無聊。 或有些人可能會覺得有趣 。 這是關于品味或易于寫作的事情。 有些類是如此之小且無關緊要,將它們寫在另一個類中更容易。 為您保存一個.java文件。 為什么不。
結論
在Java 8時代,考慮Java的非常老的功能,該語言可能不會被證明是非常令人興奮的。 靜態嵌套類是一些小眾用例的很好理解的工具。
但是,本文的重點是這個。 每次嵌套一個類時,如果您絕對不需要引用封閉的實例,請確保將其設為static 。 您永遠不知道該引用何時會在生產中使您的應用程序崩潰 。
翻譯自: https://www.javacodegeeks.com/2015/02/top-5-use-cases-for-nested-types.html
單例嵌套 ios
總結
以上是生活随笔為你收集整理的单例嵌套 ios_嵌套类型的前5个用例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xsl调用java方法传参_Java中的
- 下一篇: 安卓刷游戏机系统(安卓刷游戏)