正如我对封装的研究一样,它是关于隐藏数据以防止操纵的。为此,我们声明私有变量,以便无法从类外访问它。但是我们可以使用setter getter方法实现或在类外访问它们。因此,如果我们必须使用setter getter方法来实现它,那么其他任何人都可以使用setter getter方法来实现它。 。那么我们如何避免被操纵呢?
答案 0 :(得分:3)
封装不是安全措施,因为它可以防止人们弄乱您的代码。从某种意义上说,这是一种安全措施,即人们无法直接通过适当的渠道直接进入并更改变量。考虑以下伪代码。
class ProgressBar {
public int maximum;
public int current;
}
vs
class ProgressBar {
private int maximum;
private int current;
...
public set_current(int amount) {
if (amount <= this.maximum) this.current = amount;
}
}
在最上面的示例中,用户可以进入并干扰电流并破坏 进度条。在最下面的示例中,您的二传手可以避免这种情况。
答案 1 :(得分:1)
您需要这样看,
your code
<------ client code
客户代码将尝试访问您的代码。使用Encapsulation
,您的数据将不会受到客户端代码可以进行的操作的影响。这将有助于指定可访问性限制。
举个例子,
您正在构建游戏,并且您不希望有人增加角色的健康状况(操纵固定数据)
public class GameCharacter {
public int Health{ get; }
public GameCharacter ()
{
Health = 100;
}
}
没有人可以改变健康!
答案 2 :(得分:1)
封装的目的有两个:
getter和setter的目标是确保代码(或类)外部的参与者与您的字段仅具有一点交互,从而保持invariants。这有助于:
- 防止以非法/不可接受的方式修改值,这可能会破坏功能。
Ex:两个外部参与者试图同时修改您的帐户余额;
- 本地化将来可能更改的代码方面。
Ex:将来可以轻松地将状态变量的类型从boolean更改为enum,因为它总是从类中的getter访问;
- 实施业务规则(如果有),对您的字段进行更改时需要执行这些规则。
Ex:不允许引擎类修改汽车类的速度并将其速度设置为负值,只是因为汽车反向行驶。