getter和setter有什么用?

时间:2013-09-26 10:10:00

标签: java

假设我们要将int y设置为5,我们通常会y=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方法

8 个答案:

答案 0 :(得分:1)

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

怎么样

cat.weight = 0  

VS

cat.setWeight(0);

在setter中你可以检查体重是否具有适当的值

public void setWeight(int weight){
    if(weight > 0){
        this.weight = weight;
    }
    else{
       // SHOUT I dont want my cat to die
    }
}

答案 1 :(得分:1)

是的,您可以直接访问类的数据成员,但根据OOPS概念,数据需要封装在对象中,我们应该使用数据周围的接口来访问它。由于数据是特定对象的私有属性,因此我们将getter和setter定义为访问该数据的接口。 Getters和Setter还提供了一种隐藏数据存储细节的媒介,如果你想在每次获取或设置操作之前处理数据,这是不方便的,你不能直接访问变量。

答案 2 :(得分:0)

这主要是出于计算方面的安全考虑。 您始终将类变量声明为私有变量,并且您不能在x = 5;之外更改它们。 但是通过制定者和吸气剂你可以做到这一点。

答案 3 :(得分:0)

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

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

您可以在此处阅读更多内容:http://en.wikipedia.org/wiki/Mutator_method

答案 4 :(得分:0)

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

  1. 你只能有一个吸气剂。然后该物业是只读的。这个 应该是最常见的情况。
  2. 你可以只有一个setter,使属性可配置,但是 沟通没有别的东西应该取决于它的价值
  3. getter可以从多个字段计算值而不是返回 一个领域。
  4. 吸气者可以制作防御性副本
  5. getter可以懒惰地执行昂贵的提取操作并使用a 字段缓存值
  6. setter可以进行健全性检查并抛出IllegalArgumentException
  7. setter可以通知侦听器值
  8. 的更改

    所有这些都是隐藏在简单的“getter and setter”界面背后的实现细节。这就是封装的内容。

答案 5 :(得分:0)

你所询问的是OOP的基本思想之一。实际编程越多,就会有很多理由变得更加明显。

Encapsulation tutorial

答案 6 :(得分:0)

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

  • 将所有实例变量标记为私有。
  • 曝光二传手和吸气剂
  • 在您的setter方法中,仅在验证输入后才允许设置值。

通过这样做,您可以确保变量未设置为错误和无效的输入。

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

答案 7 :(得分:0)

这是一场漫长而长久的谈话。

我会在这里指出你正确的方向,但你需要自己解决这个问题,以便真正理解并内化它。

一个原因是,吸气剂和制定者可以保护自己。您可以控制修改变量时发生的情况。

例如,你可以决定拒绝一些价值观 - 也许你的领域需要是积极的。您不能信任调用者尊重该约束(编程规则1,不信任任何人)并且需要强制执行它,可能还有一个断言。 setter允许您在实际修改之前验证该值。直接访问允许调用者将非法值放在您的控制之外的类中 - 并且由于它可能发生,发生。

另一个原因是抽象:如果你暴露这个领域,你就会永远陷入你的代表。您可能会在以后找到更好,更优化的表示,但由于您已经让呼叫者直接访问您的字段,因此您无法更改它们 - 现在它们依赖于其类型。 另一方面,隐藏getter和setter背后的实现细节,允许您在不破坏外部合同的情况下更改内部表示 - 只需修改getter,无需任何人需要知道。