封装的目的是什么?是否提供安全层?

时间:2019-05-27 21:38:03

标签: java c# oop

正如我对封装的研究一样,它是关于隐藏数据以防止操纵的。为此,我们声明私有变量,以便无法从类外访问它。但是我们可以使用setter getter方法实现或在类外访问它们。因此,如果我们必须使用setter getter方法来实现它,那么其他任何人都可以使用setter getter方法来实现它。 。那么我们如何避免被操纵呢?

3 个答案:

答案 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)

封装的目的有两个:

  1. 将相关功能捆绑在一起;
  2. 控制对参与提供功能的字段和方法的访问。

getter和setter的目标是确保代码(或类)外部的参与者与您的字段仅具有一点交互,从而保持invariants。这有助于:

  
      
  1. 防止以非法/不可接受的方式修改值,这可能会破坏功能。
  2.   

Ex:两个外部参与者试图同时修改您的帐户余额;

  
      
  1. 本地化将来可能更改的代码方面。
  2.   

Ex:将来可以轻松地将状态变量的类型从boolean更改为enum,因为它总是从类中的getter访问;

  
      
  1. 实施业务规则(如果有),对您的字段进行更改时需要执行这些规则。
  2.   

Ex:不允许引擎类修改汽车类的速度并将其速度设置为负值,只是因为汽车反向行驶。