Java Setter和Getter

始终建议使用getter / setter访问私有变量。 为什么将它们声明为公共并访问它们不是更好的主意。 无论如何,我们使用getter和setter访问它?

@mre答案非常好,你的问题很重要。 总结一下:您将对象的字段设置为私有,以控制其他对象使用它的方式。 您的对象使用setter:

  • 限制和validation传递给setter的数据
  • 隐藏其内部数据结构(其他对象感兴趣的服务不是如何构建服务,这也可以包括优化)
  • 保持每个州的完整性(如果需要,改变其他领域)

它将使用getter

  • 根据客户需要格式化输出中的数据
  • 控制一系列服务(例如,当且仅当已建立连接时,它才会提供数据)

欢迎来到OO编程的精彩世界和结构化编程的魔力。

斯特凡

封装。

隐藏内部状态并要求通过对象的方法执行所有交互称为数据封装 – 面向对象编程的基本原则。

也可以看看:

  • 什么是对象

上面的所有答案都非常好,但我还要补充一点。

希望所有私有变量都拥有公共getter和setter。

你的getter和setter指的是外部可见的状态。 在某些情况下,在公共方法中发布的单个对象对应于实现的多个内部私有变量。 在复杂对象中,许多私有变量不会映射到外部可见的内容。 有些人无论如何都会自动为它们编写setter和getter,但这是一个坏主意,因为它暴露了你的实现细节。

我总是被告知,其中一个主要原因是试图规划未来的变化。 它可能刚刚开始

public int getInt() { return _someInt;} 

但可能会最终成为

 public int getInt() { // do some processing return _someInt; 

}

这将使您不必对访问公共属性的位置进行大量更改,而不是使用getter / setter。

通常,setter允许您对分配给私有成员的值的类型保持限制。 所以也许不允许负值,等等。

一个getter,因为你因为上述原因将其设为私有而强制访问该成员,所以允许消费者访问该成员的值。

所有其他答案都很棒而且非常真实。 这是我发现它有用的另一个原因。

在对象上使用getter和setter是遵循JavaBean约定的最大部分。 虽然遵循它通常是困难和过度的,但至少许多第三方框架/库/表达式语言依赖于访问对象字段的getter和setter约定。 如果您预先跟进它,那么您已经可以将这些对象与这些其他非常有用的库一起使用,而无需更新对象。

我使用的例子包括:

  • JSP
  • Freemarker的
  • JXLS
  • Spring(虽然Spring非常强大,但您不必遵循惯例)
  • SpEL(真的是任何表达语言)

我经常使用getter和setter,但显然我们做得不对。 例如:(从http://java.dzone.com/articles/java-properties-without获取 )

与吸气剂和设定者(方式长)

 public class Teacher { @Id @Column(length=5) @Required private String id; @Column(length=40) @Required private String name; @OneToMany(mappedBy="teacher") private Collection pupils; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Collection getPupils() { return pupils; } public void setPupils(Collection pupils) { this.pupils = pupils; } } 

与公众:(只有13行,计算空白行)。

 @Entity public class Teacher { @Id @Column(length=5) @Required public String id; @Column(length=40) @Required public String name; @OneToMany(mappedBy="teacher") public Collection pupils; } 

使用getter和setter调用(不是很清楚,但C#使它更干净)。

 teacher.setName("M. Carmen"); String result = teacher.getName(); 

打电话给公众(直接和干净)。

 teacher.name = "M. Carmen"; String result = teacher.name; 

一个是冗长的,它增加了更多的代码(和工作时间和处理时间的代码成本),而另一个是直接的。

在某些情况下,必须使用setter和getter,但如果没有,那么我认为将它用作默认值有点过分。