1. 程式人生 > >第十三條 類和成員可變性最小化

第十三條 類和成員可變性最小化

        java是開源的,三大特徵之一就是封裝,好的封裝可以讓開發者感到愉悅,壞的封裝就不說了。一個模組的設計好與不好,封裝顯得特別重要。如果一個模組的細節全都在自己模組內部處理完畢,外部需要呼叫這個模組,只需要傳入引數即可,不必自己又去呼叫內部的各個函式,進行邏輯判斷;簡單來說,模組內部隱藏細節,處理自己的邏輯,接收外部的引數,返回外部需要的結果,不麻煩外部做出額外的操作。它把細節和邏輯完全密封到自己的內部,別的模組只需要知道呼叫方法即可,無需知道實現細節。這就是資訊隱藏,或者叫封裝。

        這麼做的好處就是自己管理自己,不會與其他模組混到一起,到了後期的擴充套件 測試 修改 優化 等都會方便許多,也能提高速度,因為模組都是獨立的,不存在依賴關係,不會產生A模組沒開發完導致B模組無法開發的情況。細節隱藏,如果後期要優化,只需要改動改模組內部邏輯即可,如果一堆程式碼耦合到一起,改動起來牽涉其他模組,很可能造成誤傷。最簡單的舉例 HashMap 原始碼,1.7之前實現是陣列加連結串列實現的,根據hashcode值作為依準,1.8以後優化內部邏輯,如果連結串列內部物件超過8個,就變化為二叉表,但對外提供的put和get等方法沒變,知識內部邏輯變化了,不影響呼叫它的地方。


訪問許可權級別:
public > protected > 友好的 > private

         public : 都能訪問

         private :只能在當前類的內部引用
         protected : 跨包非子類不能訪問
         友好的 :不能跨包

private 私有的,最好理解,只能在這個類裡面使用,出了這個類就不行,即使是自己的子類也不行。
友好的,也是預設級別, 自己能用,子類能用,但子類和當前類要在一個包裡面。
protected 自己能用,子類也能用,不管子類和基類是否在同一個包下面。
public 許可權最大,誰都可以使用。

        區分這幾個,是為了更好設計模組。private 一般用於類內部自己使用,一些屬性判斷之類,只有自己使用;protected 一般是子類,如果子類要重寫某些方法或者使用某些屬性,就用它;public 看著很方便,但一旦使用,並被大量引用,後期如果要修改,就要考慮好相容性,不能出錯。 private 的好處就是,一旦看見這個標識,就可以比較放心的優化,因為邏輯都是內部的,不牽涉其他,最能給人安心感;public則相反。

        對類的例項,尤其是物件屬性,如果直接對外暴露介面,外面拿到它的引用,可以做出各種修改,如果不想讓外部修改例項,則可以進行保護性措施,比如進行 .clone 或者 生成一個新物件,賦值後對外暴露。如果內部是個final型別,外部想用它的值並作一些修改,也可用到.clone 等方法。

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


    private static final ArrayList<String> VALUES = new ArrayList<>();
    public static final  ArrayList<String> values(){
        return new ArrayList<>(VALUES);
    }