2

可能重复:
为什么要使用 getter 和 setter?

我知道这是非常微不足道的。但是为什么我们定义私有然后我们使用getter和setter。这更像是为了防止程序员在使用私有变量或方法时出错?还是出于安全原因。如果出于安全原因,那么拥有 getter 或 setter 的意义何在?我知道我们可以在 getter 和 setter 中设置限制,但那些 if 子句主要是为了防止错误而不是隐私限制。例如,我们通常不会说这些成员使用 if 子句限制对该方法的访问。

谢谢。

4

7 回答 7

11

为每个变量自动、不假思索地创建getX()和方法的做法是不好的。正如您所观察到的,这几乎毫无意义。setX()

但这是不好的部分。方法比暴露的变量要好得多,因为正如您所观察到的,您可以控制如何访问基础数据。如果您考虑一下自己在做什么,并酌情应用修改器和访问器,它们是一个很棒的工具:

  • 您可以限制客户端只能读取,但不能写入变量。
  • 您可以将整数的值限制为仅正值(例如)。
  • 您可以确保一个变量始终等于另一个变量值的一半(例如)。
  • 您可以确保,每当变量的值发生更改时,都会发送一个事件来通知其他客户端。
  • 您可以更改基础变量的数据类型,在公共方法中执行转换,并且不会破坏任何客户端。
  • 您可以将对象转换为同一对象的服务器端版本的远程客户端,同样,客户端代码不会更改。
  • 您可以使用访问器确保跨线程的严格内存排序synchronized

这些只是你可以用 mutators 和 accessors 做的一些事情。通过使用它们,您可以使您的软件易于更改和维护。

于 2012-07-23T03:05:04.453 回答
2

如果允许任何人编辑类中的变量,那么可能会发生非常糟糕的事情。(例如,如果一个粗心的用户将分母更改为零,我们可能会破坏宇宙 [或得到除以零的错误])。定义get()set()方法允许您(程序员)准确定义其他人如何与您的变量交互。

于 2012-07-23T03:04:48.927 回答
1

借助一个例子,让我解释一下这一点。假设我们有以下类:

class User {
    private String username;
    private String password;
}

现在在多个程序员工作的团队项目中。程序员A开发了User类,程序员B必须在 GUI 界面上工作。决定的政策是该password字段不能少于 5 个字符。但除非您没有创建数据字段,否则ABprivate都必须始终检查分配给该字段的新密码的有效性。password

现在假设在制作它们之后private您实现了以下 setter 方法:

public boolean setPassword( String temp ) {
    if( temp.length() >= 5 ) {
        this.password = temp;
        return true;
    }
    else {
        return false;
    }
}

这样,只有A必须编码一次,B只需使用它而不必担心策略。这总是鼓励 DRY(不要重复自己)规则。

于 2012-07-23T03:26:19.073 回答
1

还有一个好处,如果您使用 getter 和 setter,它允许子类覆盖如何使用方法和更大的灵活性访问信息。

于 2012-07-23T03:21:02.150 回答
1

我们使用私有字段并具有 getter 和 setter,因此其他类可以访问这些私有字段。如果我在一个项目中有两个类,比如 Car.java 和 Driver.java,我们希望 Driver 对象能够访问 Car.java 中的私有字段“wheel”(否则 Driver 无法驾驶汽车)。但是如果该字段是私有的,则只能使用返回该字段值的 getter 方法来访问它。Setter 允许外部类更改字段的值。您可以通过使您的字段公开(或在适当情况下受保护)而不是私有来避免使用 getter 和 setter。

于 2012-07-23T03:03:27.977 回答
1

它允许您控制对事物的访问......通过封装对一段数据的访问,您可以自由更改该数据的位置,甚至可以使其可计算。即,不是返回字段的值,而是进行一些计算。

但是,与 getter 和 setter 一样好,如果你使用它们太多,那么它表明你没有得到一个对象来完成你需要的工作。

于 2012-07-23T03:04:11.100 回答
1

Setter 和 Getter 方法基本上用于限制其他人进行任何更改。在 Java 语言中,我们提供了数据隐藏概念。这是通过 get 和 set 方法实现的。

于 2012-07-23T04:41:53.167 回答