在封装中使用公共方法对私有变量的需求是什么?而是直接声明公共变量

时间:2016-04-26 12:31:47

标签: java encapsulation

我知道这是非常基本的,但我想知道为什么我们应该在封装中使用私有变量。我提到了我的代码。所以我可以给你更好的解释。

 Class Employee
 {
      private String eName;

      public String getEname()
      {
         return this.eName;
      }
      public void setEname(String name)
      { 
           this.eName=name;
       }

这里“eName”是私有的,所以我们可以限制外部对象直接访问。变量只能使用其getter setter进行访问。

现在我的问题是为什么我们应该使用getter setter方法?我们不能将变量声明为公众。?

使用setter方法,任何人都可以更改该值,以便需要这个私有变量吗?

另一个问题

我们设置create read / write only方法如果我们不创建getter方法然后它变成只写,如果我们不创建setter方法那么它变成只读。

那么只读和只写的用途是什么?

如果我们不创建setter方法那么值将如何设置为变量?

如果我们不创建getter方法那么值将如何检索?

请给我上述简单问题的答案。

谢谢 :)

4 个答案:

答案 0 :(得分:1)

制作变量private

的重点

假设您的bankBalanceprivate变量而checkBalance()public方法,它为{{1}调用公共getter方法getbankBalance() }。 现在,我可以调用bankBalance来调用checkBalance()函数并读取getbankBalance()的值。我只能通过公共方法只读取敏感数据。

现在,如果变量bankBalancebankBalance,任何功能都可以访问并更改银行余额的值,我可以检查public变量,然后我可以更改该变量为0。

为了提供只读/写访问,我们需要创建变量packageName.ClassName.bankBalance

因此在公共方法中需要私有变量。

希望这是一个很好的解释。

答案 1 :(得分:0)

如果我们将该方法声明为公开,那么其他人可以更改其值。有时,在封装中,您不希望更改值,但只能被看到。 public成员可以被阅读,也可以被更改。因此,您声明它为private

  

那么只读和只写的用途是什么?

我很少看到只写,但只读是常见的,例如,在银行帐户软件中。您希望读取帐户余额,但不能更改!

  

如果我们不创建setter方法,那么值将如何设置为变量?

obj.eName = "Whatever";
  

如果我们不创建getter方法,那么值将如何检索?

whatever = obj.eName;

答案 2 :(得分:0)

在setter中我们可以验证设置为property的输入数据并采取相应的操作,请参阅下文:

public void setEname(String name)
      { 
          //Here we can validate input data or even throw an exception
          if(name!=null && name.length()<5){
            this.eName="Some Default Value";
            //throw new IllegalArgumentException("Your custom message goes here");
           }else{
            this.eName=name;
           }
       }

此外,许多api使用java反射来设置私有属性值,因为这种setter方法是必需的。

答案 3 :(得分:0)

  

现在我的问题是为什么我们应该使用getter setter方法?我们不能   将变量声明为公共。?

     

使用setter方法任何人都可以根据需要更改值   这个私有变量?

您的类的公共和受保护方法构成其导出的API 的一部分,即您与类的客户用户签订的合同,用于指定您的类的功能。换句话说,可访问的方法指定了您的班级行为

yout类的字段形成 state 。一个阶级的州不需要,也往往不依赖于其合同。换句话说,隐藏在课堂中的字段构成了课程实施的一部分(但不包括其行为或合同)。

请注意,实现的隐藏部分不是合同的一部分,也不是导出API的一部分。这意味着只要实施继续遵守您导出的API的合同,您就可以随时更改实施,而不会有破坏客户端程序的风险。因此,构成对象状态的字段几乎总是应该是私有的或包私有的。

当您将字段公开时,所有这些都会发生变化。在这种情况下,客户可以直接访问您的类的状态,因此它现在成为导出的API的一部分。将字段公开使您的实现成为合同的一部分,因此现在您不再可以自由地对其中的那一部分进行任何更改。只要您的班级存在,您就必须继续支持该公共变量。