0

可能的重复:
Getter 和 Setter 是邪恶的吗?

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

我错过了什么吗?

4

7 回答 7

5

因为,

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

于 2012-07-25T06:37:10.253 回答
2

他们更喜欢未来证明代码。将来如果您想消除该变量或使用另一个变量来导出此变量值 - 更改会更简单。您只需要更改 getter/setter,其余代码不受影响。这不是直接访问变量的情况。

于 2012-07-25T06:37:47.293 回答
1

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

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

于 2012-07-25T06:40:48.480 回答
1

1. 在不同的上下文中Encapsulation有不同的用途,类似的不断变化的行为需要封装在抽象类或接口中。design patterns

2.拥有private instance variablepublic 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());
于 2012-07-25T06:44:28.890 回答
0

它很简单.. 如果您将这些变量公开,那么您就授予了向它们添加任何值的权利。但是,如果您通过 getter 或 setter 执行此操作……您可以对其进行检查并控制输入或转换,而无需让最终用户知道

例如:

getName(){
  return firstName+lastName;
}

或者

 getData(){
  // code to convert byte to Mb or whatever you like to represent
 }
于 2012-07-25T06:39:37.680 回答
0

使用accessors来限制对字段变量的直接访问优于使用public fields,但是,这样做getters and setter for each and every field is overkill并被认为不是一个好习惯。不过,这也取决于具体情况,有时您只需要一个哑数据对象。Accessors应该为真正需要它们的字段添加。请参阅此链接以了解有关它的更多信息Getter Setter: To Use or Not to Use

于 2012-07-25T06:43:26.300 回答
-1

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

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

就个人而言,我认为 getter 和 setter 被过度使用了。对于完全由您控制的小型系统,直接访问可能是可行的方法。

于 2012-07-25T06:56:02.187 回答