2012-07-23 93 views
2

可能重复:
Why use getters and setters?为什么setter和getter方法

我知道这是很琐碎。但为什么我们要定义private,然后我们使用getter和setter。这更像是为了防止程序员在使用私有变量或方法时犯错误吗?或者是出于安全原因。如果出于安全原因,那么获得者或制定者有什么意义?我知道我们可以在getter和setter中有限制,但是如果子句主要是为了防止错误而不是隐私限制。例如。我们通常不会说这些成员通过if子句限制对此方法的访问。

谢谢。

回答

11

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

但是这是不认为部分是坏的。方法比暴露变量要好得多,因为正如你所观察的那样,你可以控制如何访问底层数据。如果您认为你在做什么,并应用存取器和存取适当的,他们是一个很好的工具:

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

这些只是一些你可以用mutators和访问器做的事情。通过使用它们,您可以轻松更改软件并轻松维护。

+0

非常感谢。这正是我所期待的。但总的来说,我看到许多使用私有变量的大项目,然后添加了非常简单的getter和setter方法,没有限制,等等。所以我想知道你是否不想要返回一个特定的变量为什么他们一次又一次地使用它们..我知道它们是古老的惯例,但也许我们应该在某些时候改变这个旧标准.. – Sara 2012-07-23 03:14:10

+2

很多时候,人们在不知道原因的情况下做事情,而且这绝对是一个那些时候!当你设计自己的类时,遵循这样一条简单的规则,即除非必要,否则不要添加任何存取方法。切勿将它们添加为“仅仅因为”! – 2012-07-23 03:17:03

+0

是的,正好。但是很多人都是这样使用它们的。即使是高级程序员..就像他们已经沉迷于此.. – Sara 2012-07-23 03:19:43

1

我们使用私有字段并具有getter和setter,以便其他类可以访问这些私有字段。如果我在项目中有两个类,比如说Car.java和Driver.java,我们希望Driver对象能够访问Car.java中的私有字段“wheel”(否则驱动程序不能驱动汽车)。但是,如果该字段是专用字段,则只能使用返回该字段值的getter方法进行访问。安装者允许外部类改变字段的值。您可以通过将您的字段公开(或在适当情况下进行保护)而不是私人方式来避免使用getter和setter。

+0

为什么让他们私人,如果你有访问他们与getter和setter。为什么不只是公开... – Sara 2012-07-23 03:06:24

+0

如果你想阻止特定的类能够获取/设置它们,那么你就让它们变成私有的。 – jrad 2012-07-23 03:07:45

+0

如果他们有getter和setter,所有的类都可以通过它们访问它们。 – Sara 2012-07-23 03:09:23

1

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

但是,和吸气剂和吸附剂一样好,如果你使用它们太多,那么它就是一个标志,你没有得到一个物体来做你需要的工作。

+0

谢谢。正如我所说的,它主要是一个编程工具。我的意思是你可以为此添加限制或某事。但没有隐私的好处.. – Sara 2012-07-23 03:08:18

2

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

1

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

1

在示例的帮助下,让我解释一下这一点。假设我们有以下类:

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

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

使他们以后现在假设你实现以下setter方法private

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

这样,只有一个有一次编码和有只使用它,而不用担心政策。这总是鼓励DRY(不要重复自己)规则。

1

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