原创 (22):優先考慮靜態成員類

嵌套類是指被定義在另一個類的內部的類。 嵌套類存在的目的應該只是爲了它的外圍類提供服務。如果嵌套類將來有可能會用於其他的某個環境,它就應該是頂層類。

原创 java三種遍歷集合的方法

(1):使用聚合操作 在JDK 8和更高版本中,迭代集合可以通過獲取流並對其執行聚合操作。聚合操作通常與lambda表達式結合使用,使編程更具表現力,使用較少的代碼行。以下代碼順序遍歷一組形狀並打印出紅色對象: myShapesColle

原创 (32):用EnumSet代替位域

位域:就是用int枚舉模式,將2的不同倍數賦予每個常量,這種表示法讓你用OR位運算將幾個常量合併到一個集合中(int值),稱作位域(bit field)。 位域的寫法就不介紹了,總之這種寫法缺陷比較大。 我們應該用EnumSet代替它。

原创 (27):優先考慮泛型方法

就如類可以從泛型中受益一般,方法也可以。靜態工具方法尤其適合與泛型化。JDK中的Collections泛型中的所有“算法”方法都泛型化了。 public static Set union(Set s1,Set s2) {

原创 (43):返回零長度的數組或者集合,而不是null

對於一個返回能夠null的方法,我們需要額外的代碼去處理它,這樣做很容易出錯。因爲我們很容易忘記處理null 有人認爲null返回值比零長度數組更好,因爲避免了分配數組所需要的開銷。這種觀點是錯誤的,原因有兩點: (1):在這個級別上去擔

原创 java移位簡介

首先,移位運算符有三種,其操作類型只支持:byte / short / char / int和long五種。(注意這些類型取值範圍) << 左移運算符,表示將左邊的操作數的二進制數據向左移動*位,移動後空缺位以0填充,多餘位捨棄。(等同於

原创 (17):要麼爲繼承而設計,並提供文檔說明,要麼就禁止繼承

對於專門爲了繼承而設計並且具有良好文檔說明的類而言,該類的文檔必須精確地描述覆蓋每個方法所帶來的影響。該類必須有文檔說明它可覆蓋的方法的自用性。對於每個公有的或受保護的方法或者構造器,它的文檔必須指明該方法或者構造器調用了哪些可覆蓋的方法

原创 (23):請不要在新代碼中使用原生態類型

每種泛型都定義一個原生態類型(raw type),即不帶任何實際類型參數的泛型名稱。例如List<String>爲參數化類型List就是原生態類型。 原生態類型是無法提供編譯前檢查的也就是說我們能在一個list中添加兩個不同類型的值的。這

原创 (11):謹慎的覆蓋clone

當我們想要克隆一個對象時,也就是說我們想要兩個一模一樣的對象,但想要這兩個對象各自開闢空間的時候,我們通常要實現cloneable接口。但是接口沒給我們提供clone的實現,但Object類卻給我們提供了一個受保護的clone實現。 一般

原创 (10):始終要覆蓋toString

雖然Object提供了toString的實現,但它返回的是類名+@+散列碼,這不是我們想看到的,所以強烈建議重寫toString方法,把它展示成我們

原创 (25):列表優先於數組

數組是協變的(convariant),如果Sub是Super的子類型,那麼數組類型Sub[]就是Super[]的子類型。 Object[] obs=new Long[1]; obs[0]="hhe"; 這是可以的  泛型卻是不可變的

原创 策略模式

策略模式屬於對象的行爲模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發生變化。下面就通過一個具體的例子來演示一下: 假設現在要設計一個販賣各類

原创 (18):接口優先於抽象類

因爲java只允許單繼承,所以抽象類受到了極大的限制。但是接口一點定義,被其他類廣泛應用時,其擴張就變得很困難。而抽象類的演變比接口的演變容易得多。 骨架通過對導出的每個重要接口都提供一個抽象的骨架實現類,把接口和抽象類的優點結合起來 。

原创 (13):使類和成員的可訪問性最小化

設計良好的模塊會隱藏所有的實現細節,把它的API與它的實現清晰的隔離開來。然後,模塊之間只通過它們的API進行通信,一個模塊不需要知道其他模塊的內部工作情況。這被稱封裝。封裝可以有效的解除組成系統各個模塊的耦合關係。 訪問控制機制(acc

原创 (26):優先考慮泛型

觀察下面的代碼: public class Stack<E> { private E[] elements; private int size = 0; private static final int