簡體   English   中英

如何使用封裝?

[英]How to use encapsulation?

在我閱讀在線電子書之后。他們說封裝的好處是"A class can change the data type of a field and users of the class do not need to change any of their code." 我不明白他們在說什么。 該點的主要含義是什么? 請給一個例子嗎?

讓我們看一個簡單的Vehicles類,它維護一個列表:

public class Vehicles {

    private ArrayList<String> vehicleNames;

    Vehicles() {
        vehicleNames = new ArrayList<String>();
    }

    public void add(String vehicleName) {
        vehicleNames.add(vehicleName);
    }
}

客戶端將通過以下方式使用它:

public class Client {

    Public static void main(String []args) {
        Vehicles vehicles = new Vehicles();
        vehicles.add("Toyota");
        vehicles.add("Mazda");
    }
}

現在,如果Vehicles將其內部私有的vehicleNames字段更改為LinkedList ,則Client將不受影響。 這就是本書在談論的內容,即由於封裝,用戶/客戶端不需要進行任何更改即可解決類中的更改。

封裝在面向對象的編程中非常重要。 使用封裝,您可以向使用您的類庫/ API的用戶隱藏信息。

你問:“為什么我要向用戶隱藏東西?” 原因很多。 一個主要原因是,有些頑皮的用戶或者只是不知道API在做什么的用戶可能會弄​​亂您的類和東西。 讓我給你舉個例子。

假設您在這里有一堂課:

public class Computer {
    public int coreCount;
}

如您所見, coreCount被聲明為public 這意味着所有其他類都可以訪問它。 現在想象一個頑皮的人這樣做:

Computer myPC = new Computer ();
myPC.coreCount = 0;

即使是傻瓜也可以說這沒有任何意義。 它也可能會影響程序的其他內容。 假設您想除以核心數量。 將會發生異常。 因此,為防止這種情況,我們應該創建setter和getter並將字段標記為private

C#版本:

public class Computer {
    private int coreCount;
    public int CoreCount {
        get {return coreCount;}
        set {
            if (value > 0)
                coreCount = value;
        }
    }
}

Java版本

public class Computer {
    private int coreCount;
    public int getCoreCount () {return coreCount;}
    public void setCoreCount (int value) {
        if (value > 0)
            coreCount = value;
}

現在,沒有人可以將核心計數設置為非正值!

這是封裝的示例。 說我們有一個Person類,就像這樣

class Person {
  private String name;
  private String email;
  public String getName() { return this.name; }
  public String getEmail() { return this.email; }

  public void setName(String name) { this.name = name; }
  public void setEmail(String email) { this.email = email; }
}

並且在某個時候,我們決定我們需要將這些值存儲為HashMap (出於某種原因或其他原因),而不是將其存儲為一對字符串。

我們可以更改內部表示,而無需像這樣修改Person類的公共接口。

class Person {
  HashMap<String, String> data;
  public Person() {
    this.data= new HashMap<String, String>();
  }
  public String getName() { return this.data.get("name"); }
  public String getEmail() { return this.data.get("email"); }

  public void setName(String name) { this.data.put("name", name); }
  public void setEmail(String email) { this.data.put("email", email); }
}

從客戶端代碼的角度來看,我們仍然可以獲取和設置Strings名稱和電子郵件,而無需擔心其他任何事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM