日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Effective Java之類和接口

Effective Java之類和接口

來源:程序員人生   發布時間:2016-10-05 09:29:17 閱讀次數:2519次

本文是《Effective Java》1書的整理筆記


使類和成員的可訪問性最小化

設計良好的模塊會隱藏所有的實現細節,把它的API與它的實現清晰地隔離開來。然后,模塊之間只通過它們的API進行通訊,1個模塊不需要知道其他模塊的內部工作情況,這1概念被稱為信息隱藏(information hiding)或封裝(encapsulation)

封裝的好處

它可以有效地消除組成系統各模塊之間的耦合關系,使得這些模塊可以獨立的開發、測試、優化、使用、理解和修改。這樣可以加快系統開發的速度,由于可以并行開發。
減輕保護的負擔,由于程序員可以更快的理解這些模塊,并在調試的時候可以不影響其他模塊的負擔。
雖然信息隱藏不會帶來更好的性能,但可以有效的調理性能:通過剖析肯定了那些模塊影響了性能。
提高了軟件的可重用性
下降了構建大型系統的風險,由于即便全部系統不可用,但這些獨立的模塊卻有多是可用的。

封裝的規則

  • 盡量的使每一個類或成員不被外界訪問
  • 如果1個包級私有的頂層類只在某1類的內部被用到,應當斟酌使它成為唯1使用它的那個類的私有嵌套類
  • 成員變量不能是公然的,常量是例外。

    可使用public static final來修飾常量
    另外常量要末包括基本類型,要末指向不可變對象的援用。雖然援用不能被修改,但援用的對象卻是可以被修改的。

  • 長度為非0的數組總是可變的,因此用public static final修飾的數組容易帶來潛伏的安全漏洞。

有兩種解決方式,1是將數組變成私有,并添加1個公有的不可變列表

private static final Thing[] PRIVATE_VALUES = {}; public static final List<Thing> VALUES= Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

2是使數組變成私有的,并添加1個公有方法,返回數組的備份。

private static final Thing[] PRIVATE_VALUES = {}; public static final Thing[] values() { return PRIVATE_VALUES.clone(); }

使用方法訪問類成員變量

使用setter和getter方法訪問類成員變量,有以下好處
* 可以添加束縛條件
* 可以靈活的修改該類的內部表示方式

如何設計不可變類

不可變類的每一個實例包括的所有信息都必須在創建該實例的時候就提供,>并在對象的全部生命周期內固定不變。

不可變類遵守的規則

  • 不要提供任何會修改對象屬性的方法
  • 保證類不會擴大
  • 使所有域都是final
  • 所有的域都成為私有的
  • 確保對任何可變組件的互斥訪問
    如果類中有指向可變對象的變量,要確保不會被該類的客戶端取得指向這些對象的援用。在構造器、訪問方法和readObject方法中使用保護性拷貝。

不可變類的設計

  • 不可變對象本質上是線程安全的,它們不要求同步。

    可以提供1個靜態工廠將該類經常使用的實例緩存起來,基本包裝類和BigInteger都有這樣的靜態工廠。

  • 不要用為不可變對象提供clone方法或拷貝構造器

  • 不可變類的缺點是對不同的值都需要1個單獨的對象。

    可以提供1個配套的公有的可變配套類,避免在大范圍操作時釀成的性能消耗,例如StringStringBuilder

  • 聲明構造器為private可以避免該類被繼承。

  • 許多不可變類具有多個非final域,當它們第1次被要求計算時,把1些開消昂貴的結果緩存到這些域中,以便下次再次要求一樣的計算,就直接返回這些緩存的值。
  • 如果需要讓不可變類實現Serializable接口,就必須顯示的提供1個readObjectreadResolve方法,或使用ObjectOutputStream.writeUnsharedObjectInputStream.readUnshared方法。
  • 如果1個類不能被設計成不可變的,應當盡可能限制其可變性。

組合優于繼承

《Java編程思想》稱為組合,《Effective Java》稱為復合

4.1 繼承的缺點

這里所說的缺點不包括,接口繼承和完全為繼承而設計的超類

  • 繼承打破了封裝性,子類依賴超類中特定功能的實現細節,但超類的實現有可能隨著發行版本的不同而有所變化。
  • 如果超類在后續版本中添加了1個新的方法,該方法與子類中的某1方法簽名相同但返回值不同,將致使編譯毛病。

取代繼承的方式

  • 使用轉發的方式代替繼承(裝潢器模式)
  • 采取組合方式代替繼承

甚么時候需要繼承

  • 只有當二者之間確切存在“is-a”關系的時候
  • 當超類的API設計有缺點時,采取繼承機制會傳播缺點,復合則允許新的API隱藏這類缺點

要末為繼承而設計,并提供文檔說明,要末制止繼承

可覆蓋的方法是指非final的,publicprotected的方法

  • 該類必須有文檔說明它可覆蓋的方法的自用性
    也就是說必須精確的描寫覆蓋每一個方法所帶來的影響。
    對可覆蓋的方法或非private構造器,必須指明它調用了那些可覆蓋的方法,是以甚么順序調用的,每一個調用結果又是如何影響后續的處理進程。那些情況下它會調用可覆蓋的方法
  • 構造器不能調用可被覆蓋的方法
    超類構造器將在子類構造器之前被調用,所以子類中覆蓋的版本方法將在子類構造器之前被調用,如果該方法依賴構造器所履行的初始化方法,那末將有可能致使程序失敗。
  • 對為繼承而設計的類中實現CloneableSerializable接口,不管clone還是readObject都不可以調用可覆蓋的方法,不管是間接還是直接。
  • 對為繼承而設計的類中實現Serializable,并且該來有readResolvewriteReplace方法,就必須使其成為protected,避免子類疏忽這兩個方法。
  • 對不專門為繼承而設計的類,最好要制止子類化

接口優于抽象

  • 現有類可以很容易被更新,以實現新的接口
  • 接口是定義mixin的理想選擇
    mixin是指這樣的類型,類除實現它的“基本類型”以外,還可以實現這個mixin類型,以表明它提供了某些可供選擇的行動。
    接口之所以被稱為mixin,是由于它允許任選的功能可被混合到類型的主要功能中。
  • 接口允許我們構造非層次結構的類型框架
  • 接口可以安全的增強類的功能
  • 可以將接口和抽象類結合起來,提供1個抽象的骨架實現。例如AbstractCollection

接口只用于定義類型

接口應當只被用來定義類型,不應當用于聲明常量

優先斟酌靜態成員類

  • 嵌套類(nested class)是指定義在另外一個類的內部的類,包括靜態成員類、非靜態成員類、匿名類、局部類。
  • 嵌套類存在的目的應當只是為它的外圍類提供服務。
  • 如果1個嵌套類在單個方法以外依然可見,或它太長了,不合適放在方法內部,就應當使用成員類。
  • 如果成員類的每個實例都需要1個指向外圍實例的援用,就要把成員類聲明為非靜態的。否則就要聲明為靜態的。
  • 如果這個嵌套類屬于1個方法的內部,并且你只需要在1個地方創建實例,而且已有1個預置的類型可以說明這個類的特點,就要把它做成匿名類。

靜態成員類

  • 靜態成員類是外圍類的1個靜態成員,與其他靜態成員1樣,遵照一樣的可訪問性規則。
  • 靜態成員類的常見用法是作為公有的輔助類,僅當與它的外部類1起使用時才成心義。
  • 私有靜態成員類的另外一個常見用法是作為外圍類所代表對象的1個組件。

非靜態成員類

  • 非靜態成員類的1個常見用法是定義1個Adapter,它允許外部類的實例被看做另外一個不相干的類的實例。例如Map接口中的集合視圖。
  • 非靜態成員類的每一個實例都將包括1個額外的指向外圍對象的援用,這需要消耗額外的空間和時間,并且會致使外圍實例在符合垃圾回收時仍然得以保存,因此除非必須訪問外圍實例,否則要始終把成員類聲明為static

匿名類

  • 匿名類要盡可能簡短,否則會影響程序的可讀性。10行或更少。
  • 匿名類的1個常見用法是動態的創建函數對象,例如匿名Comparator實例。
  • 匿名類的另外一個常見用法是創建進程對象,例如RunnableThread

歡迎大家訪問我的博客,轉載請注明出處
http://blog.csdn.net/abyss521

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 99精品久久 | 成人午夜免费电影 | 午夜二区 | 欧美午夜一区二区三区 | 国产特级毛片aaaaaaa高清 | 国产欧美一区二区精品久导航 | 欧美日韩综合在线 | 亚洲乱码一区二区三区三上悠亚 | 成人黄色免费大片 | 欧美日韩电影一区二区 | 99久久精品免费 | 日韩不卡免费视频 | 国产粉嫩一区二区三区在线观看 | 国产中文在线播放 | 日韩精品视频中文字幕 | 欧美激情自拍偷拍 | 国产精品久久久久久影视 | 免费中文| 黄视频在线播放 | 亚洲精品欧美一区二区三区 | 色婷婷亚洲综合 | 精品欧美一区二区三区在线观看 | 欧美日韩亚洲第一 | a级片在线免费看 | 欧美国产日韩一区二区三区 | 久久成人在线 | 中文字幕在线不卡视频 | 在线欧美国产 | 国产午夜精品一区二区三区四区 | 日本综合久久 | 国产精品三级三级三级 | 99久久精品一区二区成人 | 亚洲精品视频一区二区三区 | 久久一级精品视频 | 欧美福利专区 | 视频一区在线 | 中文字幕精品一区二区三区精品 | 国产一区二区三区视频在线观看 | 久久免费视频在线观看 | 看片一区二区 | 亚洲国产视频网站 |