Java 为什么鼓励使用处理程序的私有变量?

Java 为什么鼓励使用处理程序的私有变量?,java,android,theory,Java,Android,Theory,可能重复: 我找不到一个逻辑上的原因来解释为什么拥有一个带有getter和setter的私有变量比拥有一个公共变量更可取,它除了直接处理值之外什么都不做 我错过什么了吗?因为 验证是一个原因。将字段名保留在公共API之外还允许您以后在不破坏API的情况下对其进行更改。它还允许您稍后以其他方式更改类,例如将字段移动到其他类(以便公共setter调用其他类中的setter)。调用setter还允许您执行其他操作,例如,将值的更改通知感兴趣的其他组件。如果直接访问该字段,这一切都是不可能的。他们更倾

可能重复:

我找不到一个逻辑上的原因来解释为什么拥有一个带有getter和setter的私有变量比拥有一个公共变量更可取,它除了直接处理值之外什么都不做

我错过什么了吗?

因为


验证是一个原因。将字段名保留在公共API之外还允许您以后在不破坏API的情况下对其进行更改。它还允许您稍后以其他方式更改类,例如将字段移动到其他类(以便公共setter调用其他类中的setter)。调用setter还允许您执行其他操作,例如,将值的更改通知感兴趣的其他组件。如果直接访问该字段,这一切都是不可能的。

他们更倾向于将来验证代码。在将来,如果您希望消除该变量或使用另一个变量来导出该变量值,则更改会更简单。您只需要更改getter/setter,其余代码不受影响。直接访问变量的情况并非如此。

这很简单。。如果您将这些变量公开,那么您将为它们提供读取任何值的权限。 但如果你通过getter或setter来实现这一点。。。您可以对其进行检查并控制输入或转换,而无需让最终用户知道这一点

例如:

 getData(){
  // code to convert byte to Mb or whatever you like to represent
 }

正如@user370305已经提到的,一个原因是验证。 另一个原因是类型转换。Setter可以接受字符串并将其解析为整数。 另一个原因是数据封装。不一定要在同一个类中存储一个简单的文件。类
Person
的方法
setName(String)
可以将名称存储在更复杂的数据结构中。使用简单字段不允许您在不影响使用它的代码的情况下更改类
Person
的内部实现

编辑: 还有另一个技术原因。
使用getter和setter发现和调试代码要容易得多。如果某个字段发生意外更改,您可以将断点切换到相应的setter,并很快发现问题。如果此字段是公共字段,并且您有1000个对此字段的引用,那么理论上必须在所有这些位置放置1000个断点

使用
访问器
来限制对字段变量的直接访问优于使用
公共字段
,然而,为每个字段制作
getter和setter是过分的
,被认为不是一个好的做法。不过,这也取决于具体情况,有时您只需要一个哑数据对象<代码>访问器应该添加到真正需要它们的字段中。查看此链接了解更多信息。

1。
封装在不同的上下文中有不同的用途,在
设计模式中,它类似的不断变化的行为需要封装在抽象类或接口中

2.具有
私有实例变量和
公共getter setter
是b

3.其主要目的是验证用户的输入。。。直接将值设置为实例变量是危险的

例如:

int dogAge;

       System.out.println("My dogs age is :"+dogAge);
现在如果有人给出一个负年龄怎么办。。。然后……?

所以我们必须这样做…

int dogAge;

      public void setAge(int age){

       if (age>0){
         dogAge = age;
        }
       else{

              System.out.println("Not a valid age");
           }

     }

     public int getAge(){


        return dogAge;

      }

    System.out.println("My dog age is :"+ getAge());
我找不到一个逻辑上的原因来解释为什么拥有一个带有getter和setter的私有变量比拥有一个公共变量更可取,它除了直接处理值之外什么都不做

考虑到您放入getter和setter的任何额外代码都会增加复杂性,并且还需要进行测试。对于完全由您控制的小型系统,使用getter和setter可能没有什么好处。运用你的专业判断。您可能不需要将来的验证和增加复杂性。或者,对您来说,拥有直接访问的效率和简单性可能更重要


就我个人而言,我认为能手和二传手被过度使用了。对于一个完全由您控制的小型系统,直接访问可能是一个不错的选择。

是许多文章中的一篇。还有一些OOPs设计模式,如封装、类型转换等都很重要。如果您阅读了基本的OOPs设计概念,就很容易理解面向对象编程结构是如何工作的。。
int dogAge;

      public void setAge(int age){

       if (age>0){
         dogAge = age;
        }
       else{

              System.out.println("Not a valid age");
           }

     }

     public int getAge(){


        return dogAge;

      }

    System.out.println("My dog age is :"+ getAge());