Java Setter和Getter

时间:2011-08-26 16:48:19

标签: java getter-setter

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

7 个答案:

答案 0 :(得分:19)

封装

  

隐藏内部状态并要求执行所有交互   通过对象的方法称为数据封装 - a   面向对象程序设计的基本原理。

另见:

答案 1 :(得分:12)

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

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

它将使用getter

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

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

斯特凡

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:7)

我总是被告知,其中一个主要原因是尝试计划未来的变化。它可能只是

public int getInt() { return _someInt;}

但最终可能会

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

}

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

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

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

我使用过的例子包括:

  • JS​​P
  • Freemarker的
  • JXLS
  • Spring(虽然Spring非常强大,你不必遵循惯例)
  • SpEL(真正的任何表达语言)

答案 6 :(得分:1)

我经常使用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;
 }

}

with public :(只有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,但如果没有,那么我认为将它用作默认值有点过分。