1

假设我们想设置一个我们通常做int y的值5y=5;

int y=0;
y=5;

但是如果我们使用 getter 和 setter 比我们按照以下方式

public class x {
private int y;
    public int getY() {
    return y;
}
public void setY(int y) {
    this.y = y;
}

然后我们创建 x 的对象并调用它的方法

x x1=new x();
x1.setY(5);

我的问题是如果我们可以直接设置 y=5 那么为什么要使用 getter 和 setter 方法

4

8 回答 8

1

如果您想控制可以设置的值,请​​使用 setter。

怎么样

cat.weight = 0  

对比

cat.setWeight(0);

在设置器中,您可以检查重量是否具有适当的值

public void setWeight(int weight){
    if(weight > 0){
        this.weight = weight;
    }
    else{
       // SHOUT I dont want my cat to die
    }
}
于 2013-09-26T10:12:13.133 回答
1

是的,您可以直接访问类的数据成员,但根据 OOPS 概念,数据需要封装在对象中,我们应该使用数据周围的接口来访问它。由于数据是特定对象的私有属性,我们将 getter 和 setter 定义为访问该数据的接口。Getter 和 Setter 还提供了一种隐藏数据存储细节的媒介,如果您想在每次 get 或 set 操作之前处理数据,而您无法通过直接访问变量来执行此操作,那么它可以派上用场。

于 2013-09-26T10:16:03.873 回答
0

这最常用于面向对象的编程中,与封装的概念保持一致。通过保持类的成员变量为私有,您可以隐藏它们并防止它们受到其他代码的影响。

您只能使用公共成员函数修改这些变量。设置此界面并隐藏数据或详细信息可以更轻松地阅读代码。

你可以在这里阅读更多:http ://en.wikipedia.org/wiki/Mutator_method

于 2013-09-26T10:14:03.310 回答
0

Setter 和 getter 被用作面向对象编程中最佳实践的一部分。要遵循的一些步骤是:

  • 将所有实例变量标记为私有。
  • 公开 setter 和 getter
  • 在您的 setter 方法中,仅在验证输入后才允许设置值。

通过遵循这一点,您可以确保不会将变量设置为错误和无效的输入。

您可以在 setter 中调用validate()方法,并具有验证该方法中的输入的逻辑。

于 2013-09-26T10:21:21.930 回答
0

这是一个很长很长的对话。

我只是在这里为您指出正确的方向,但是您需要自己解决这个问题才能真正理解和内化它。

原因之一是 getter 和 setter 允许您保护自己。您可以控制修改变量时发生的情况。

例如,您可以决定拒绝某些值 - 例如,您的字段可能需要是正整数。您不能相信调用者会尊重该约束(编程规则 1,不要信任任何人)并且需要强制执行它,可能需要使用断言。setter 允许您在实际修改值之前对其进行验证。直接访问允许调用者将非法值放入您的类中,不受您的控制——既然它可能发生,它就会发生。

另一个原因是抽象:如果您公开该字段,您将永远被您的表示所困扰。稍后您可能会找到更好、更优化的表示,但您无法更改它,因为您已经让调用者直接访问您的字段 - 他们现在依赖于它的类型。另一方面,将实现细节隐藏在 getter 和 setter 之后,可以让您在不破坏外部合同的情况下更改内部表示- 只需修改 getter,无需任何人知道。

于 2013-09-26T10:21:37.140 回答
0

这主要是出于计算中的安全原因。您总是将类变量声明为私有变量,并且您不能使用 x=5; 将它们更改为外部变量。但是使用 setter 和 getter,您可以实现这一点。

于 2013-09-26T10:13:10.993 回答
0

您要问的是 OOP 中的基本思想之一。你做的编程越多,确实有很多原因会变得更加明显。

封装教程

于 2013-09-26T10:18:30.037 回答
0

getter 和 setter 的真正意义在于,您应该只在适当的地方使用它们,并且它们可以做的不仅仅是获取和设置字段。

  1. 你只能有一个吸气剂。然后该属性是只读的。这实际上应该是最常见的情况。
  2. 您可以只有一个 setter,使属性可配置,但传达没有其他东西应该依赖于它的值
  3. getter 可以从多个字段计算一个值,而不是返回一个字段。
  4. 吸气剂可以制作防御性副本
  5. getter 可以懒惰地执行昂贵的 fetch 操作并使用字段来缓存值
  6. setter 可以进行完整性检查并抛出 IllegalArgumentException
  7. setter 可以通知监听器值的变化

所有这些都是隐藏在简单的“getter and setter”接口后面的实现细节。这就是封装的意义所在。

于 2013-09-26T10:16:39.340 回答