[英]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.