封装的定义是正确的

  • 本文关键字:定义 封装 java oop
  • 更新时间 :
  • 英文 :


当我阅读一些文件时,他们说:

  1. 封装是一种将数据成员和对这些数据成员进行操作的成员函数组合到一个单元中的方法
  2. 封装最大限度地减少了类之间的相互依赖性,通常通过信息隐藏来实现
    封装有助于防止代码更改的连锁反应,从而有助于创建更易于维护的代码
    它还通过减少对对象状态和行为的直接访问来帮助创建松散耦合的代码
private String time;
public String getTime() {
return time;
}

比方说我决定用字符串来记录时间
过了一段时间,我意识到表示秒的int可能是更好的时间数据类型
我不仅必须更改对象中的数据类型,而且每次在整个程序中引用对象的时间时都必须更改!

private int time;
public int getTime() {
return time;
}

当我使用getter时,它没有达到​​定义2

假设我们有一个Time类,为了简化本例,假设我们只希望精确到分钟,即HH:MM。未封装,即:

class Time {
public int hour;
public int minute;
}

然后出于以下一个或多个原因进行封装。

限制访问,即验证

我们不希望公开访问这些字段,因为这样我们就无法确保这些值是有效的(分别为0-23和0-59(。

所以我们封装:

class Time {
private int hour;
private int minute;
public int getHour() {
return this.hour;
}
public int getMinute() {
return this.minute;
}
public void setHour(int hour) {
if (hour < 0 || hour > 23)
throw new IllegalArgumentException("Invalid hour: " + hour + " (must be 0-23)");
this.hour = hour;
}
public void setMinute(int minute) {
if (minute < 0 || minute > 59)
throw new IllegalArgumentException("Invalid minute: " + minute + " (must be 0-59)");
this.minute = minute;
}

信息捆绑

即使数据存储为hourminute,我们也可以强制将值一起给定

class Time {
private int hour;
private int minute;
public int getHour() {
return this.hour;
}
public int getMinute() {
return this.minute;
}
public void setTime(int hour, int minute) {
if (hour < 0 || hour > 23)
throw new IllegalArgumentException("Invalid hour: " + hour + " (must be 0-23)");
if (minute < 0 || minute > 59)
throw new IllegalArgumentException("Invalid minute: " + minute + " (must be 0-59)");
this.hour = hour;
this.minute = minute;
}

当数据是共相关的时,这尤其有用,例如对于Date类,day值的范围取决于month值,以及在确定二月的有效范围时取决于year值。

信息隐藏

如果我们进行封装,我们可以稍后决定更改内部结构,以不同的方式存储值,例如,我们可以决定将值存储为一天中的每分钟。

class Time {
private int minuteOfDay;
public int getHour() {
return this.minuteOfDay / 60;
}
public int getMinute() {
return this.minuteOfDay % 60;
}
public int setHour(int hour) {
setTime(hour, getMinute());
}
public int setMinute(int minute) {
setTime(getHour(), minute);
}
public void setTime(int hour, int minute) {
if (hour < 0 || hour > 23)
throw new IllegalArgumentException("Invalid hour: " + hour + " (must be 0-23)");
if (minute < 0 || minute > 59)
throw new IllegalArgumentException("Invalid minute: " + minute + " (must be 0-59)");
this.minuteOfDay = hour * 60 + minute;
}

可以看出,封装确保了从外部看没有任何变化。

最新更新