如何使用封装

本文关键字:封装 何使用 | 更新日期: 2023-09-27 18:18:49

在线阅读电子书后。他们说封装的好处是"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,客户端将不受影响。这就是书中所说的,用户/客户端不需要做任何改变来解释由于封装而导致的类的变化。

封装在面向对象编程中非常重要。使用封装,您可以对使用您的类库/API的用户隐藏信息。

你会问:"为什么我需要对用户隐藏一些东西?"原因有很多。一个主要原因是,一些不懂API的用户可能会弄乱你的类和其他东西。让我给你举个例子。

假设这里有一个类:

<>之前公共类计算机{public int cocount;}之前

在这里可以看到,coreCount被声明为public。这意味着所有其他类都可以访问它。现在想象一个淘气的人这样做:

<>之前计算机myPC = new Computer ();myPC。cocount = 0;之前

即使傻瓜也能看出这没有任何意义。它还可能影响程序的其他内容。假设你想要除以核心数。将发生异常。因此,为了防止这种情况,我们应该创建setter和getter,并将字段标记为private

c#版本:

<>之前公共类计算机{private int cocount;public int cocount {get{返回cocount;}集{If (value> 0)cocount = value;}}}之前

Java版本<>之前公共类计算机{private int cocount;public int getcocount(){返回cocount;}public void setcocount (int value) {If (value> 0)cocount = 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); }
}

从客户端代码的角度来看,我们仍然可以获取和设置字符串名称和电子邮件,而不用担心其他任何事情