78條高質量編碼建議《Effective Java》(12~16)閱讀筆記

看看我們的資料:4000G java架構師資料(需要的話關注留言)

主要內容:21套Java精品高級課架構課包含:java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,架構設計,web安全,高併發,高性能、高可用、高可擴展,分佈式,集群,電商,緩存,性能調優,設計模式,項目實戰,工作流,程序調優,負載均衡,Solr集群與應用,主從複製,中間件,全文檢索,Spring boot,Spring cloud,Dubbo,Elasticsearch,Redis,ActiveMQ,Nginx,Mycat,Spring,MongoDB,ZeroMQ,Git,Nosql,Jvm,Mecached,Netty,Nio,Mina,Nutch,Webservice,Activiti,Shiro,Tomcat,大型分佈式電商實戰等高端視頻課程......,Android、ios、微信小程序移動app應用,以及2017年最火的大數據(hadoop、hbase、hive、spark、storm等),python,人工智能能智能。

78條高質量編碼建議《Effective Java》(12~16)閱讀筆記

接著上期繼續看本書高質量編碼建議12~16條的閱讀筆記

12.考慮實現comparable接口

關於Comparable接口其中只有一個方法——compareTo。此方法和equals有類似之處,不過它所表達的含義相比equals要更多。equals通常是比較兩個值是否相等,相等返回true,不相等返回false。compareTo則約定為第1對象若“大於”第2個對象則返回整數,“等於”則返回0,“小於”則返回負數,compareTo能約定更為複雜的“比較”,例如比較兩個字符串進行字典序的比較,str = “abc”, str2 = “abd”,str.equals(str2)返回false,而str.compareTo(str2)則返回正數。compareTo與equals一樣同樣需要遵守自反性、對稱性、傳遞性。同樣有一個強烈的建議就是compareTo應該返回和equals方法相同的結果,但如果不一致,也不是不可以,就是最好能在註釋中寫明兩個方法返回的結果不同。

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

如何正確地使用訪問權限?首先在定義一個成員變量時類型前會有一個修飾符public 、protected、private(或者沒有)。在未學習到“面向對象”時,初學時老師為了講解方便直接將變量定義為了public,慢慢接觸到了面向對象的三大特性:繼承、封裝、多態,我們也學會了將成員變量的訪問權限定義為private。

此條實際上就是講解面向對象的三大特性之一——封裝。

  private——只有在聲明該成員的類才能訪問其他類都不能訪問

  default(默認訪問修飾符)——又稱為“包級私有”,也就是說只有在同一個包下的類才能訪問,就算是它的子類但不是在同一包下也不能訪問。

  protected——有兩種情況可以訪問:1、和default一樣同一個包下的類能夠訪問。2、它的子類也能訪問。

  public

——任何類都能訪問

為什麼書中提到提到要將可訪問性最小化呢?實際上原因在於可維護,一旦你將可訪問性置為protected或者public,意味著很大範圍的類都能對它就行訪問、修改、引用等等,如果你修改了這個變量意味著你要同時修改很多其他的類。但如果可訪問性很小private的話,意味著你修改了這個變量,其他類並不知道啊,只對屬性相關的類修改就行,不用擔心還有其他哪個地方有用到。

對於成員變量通常使用private類,如果完全不提供訪問的渠道或者途徑似乎也是“死”的,這是setter/getter方法,有人在初學時可能會發出疑問,既然提供了能訪問修改這個成員變量的方法,那何不直接置為public呢?原因在於方法是可以提供檢查的,它能檢查傳入的值是否符合規範。

另外還有一條規則限制了降低方法的可訪問性的能力,那就是如果方法覆蓋了超類中的一個方法子類中的訪問級別就不允許低於超類中的訪問級別

就是說如果父類的方法是public,那麼子類就不能是private;如果父類的方法是protected,那麼子類就只能是protected或者public。

14.在公有類中使用訪問方法而非公有域

這一條實際上我們在上一條已經說到對於類的成員變量,我們通常對它的訪問控制置為private,併為它提供getter/setter方法。

15.使可變性最小化

注意第13條指的是“可訪問性”主要講訪問修飾符,而這一條指的是“可變性”講的是final關鍵字。

對於final關鍵字,我想很多人對於它的用法基本上是處於以下用法:

private static final String NAME="LiSi";

把它和static關鍵字配合使用使得程序中不會出現硬編碼,而是以常量的形式出現,這樣也便於修改和閱讀,但是final的功效遠遠不止於此。

首先來了解下什麼是不可變的對象,最為常見的就是String類,這個類大家都清楚是不可變的,至於為什麼在賦值過後還能對它進行賦值那是因為在常量池中又定義了一個常量使得引用指向了這個新的常量,而不是在原有值的基礎上做修改。

以下是final的常見用法:

1、 用final關鍵字修飾類,使得該類不可以被繼承。例如String類就利用final修改使得它不可以被繼承。

2、 用final關鍵字修飾成員變量,使得該變量變為不可變的對象引用,此時應該給它賦初值,之後它不能被重新賦值,準確來講是它的引用不可改變。注意是引用不可改變,不代表被引用的對象內部不能改變,如果引用的對象本身是一個引用類型例如:

private Student stu = new Student();

stu.setName(“kevin”);

stu.setName(“ylf”); //這是合法的

//stu = new Student(); //這不合法,因為它改變了stu的引用

3、 比較通用的就是開篇提到的和static配合使用定義常量。

個人認為final關鍵字的使用比較巧妙,用的好可以省去大量代碼來保證線程安全,用的不好則是東施效顰帶來嚴重後果,有關final關鍵字和線程安全可以參考《Java併發編程實戰》一書對於fianl的講解。

16.複合優先於集成

這條建議也是十分常見,最實際的例子就是《組合模式》的運用。在JDK中一個很明顯的例子就是顯式鎖的實現,例如ReentrantLock繼承自Lock接口,但其內部實現則是通過AbstractQueueSynchronizer。

今天就這麼多了,明天持續更新,下期內容:

17.要麼為繼承而設計,並提供文檔說明,要麼禁止使用繼承

18.接口優先於抽象類

19.接口只用於定義類型

20.類層次優先於標籤類

21.用函數對象表示策略

22.優先使用靜態成員類

看看我們的資料:4000G java架構師資料

主要內容:21套Java精品高級課架構課包含:java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,架構設計,web安全,高併發,高性能、高可用、高可擴展,分佈式,集群,電商,緩存,性能調優,設計模式,項目實戰,工作流,程序調優,負載均衡,Solr集群與應用,主從複製,中間件,全文檢索,Spring boot,Spring cloud,Dubbo,Elasticsearch,Redis,ActiveMQ,Nginx,Mycat,Spring,MongoDB,ZeroMQ,Git,Nosql,Jvm,Mecached,Netty,Nio,Mina,Nutch,Webservice,Activiti,Shiro,Tomcat,大型分佈式電商實戰等高端視頻課程......,Android、ios、微信小程序移動app應用,以及2017年最火的大數據(hadoop、hbase、hive、spark、storm等),python,人工智能能智能。

78條高質量編碼建議《Effective Java》(12~16)閱讀筆記


分享到:


相關文章: