如何使用封装
本文关键字:封装 何使用 | 更新日期: 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
。这意味着所有其他类都可以访问它。现在想象一个淘气的人这样做:
即使傻瓜也能看出这没有任何意义。它还可能影响程序的其他内容。假设你想要除以核心数。将发生异常。因此,为了防止这种情况,我们应该创建setter和getter,并将字段标记为private
。
现在没有人可以将核心计数设置为非正值!
下面是一个封装的例子。假设我们有一个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); }
}
从客户端代码的角度来看,我们仍然可以获取和设置字符串名称和电子邮件,而不用担心其他任何事情