何时在java中使用get / set方法

我想知道何时在我的类中使用get和set方法(getName,setName)以及简单的classVariable.name = ""而不是а = classVariable.getName()

这是使用set和get方法的类的示例

 public class ClassExampe { String name; String course; public String getName ( ) { return name; } public void setName (String studentName) { name = studentName; } public String getCourse ( ) { return course; } public void setCourse (String studentCourse) { course = studentCourse; } } 

谢谢

使用Getters / Setters与使用Fields

根据经验:

直接使用来自同一个类的变量(实际上来自同一个.java文件,因此内部类也可以),使用其他类中的Getters / Setters。

简单的规则是:永远不要使用直接访问(当然,除了从类中引用它们之外)。

  • 字段访问无法代理
  • 你可能想要一些事件通知
  • 你可能想要防范竞争条件
  • 表达式语言支持setter和getters
  • 从理论上讲,这打破了封装。 (如果我们迂腐,所有领域的setter和getter也打破了封装)
  • 可能想在setter或getter中执行一些额外的逻辑,但这很少是可取的,因为消费者希望这遵循惯例 – 即作为一个简单的getter / setter。
  • 您只能指定一个setter或只能指定一个getter,从而实现只读或只写访问。

即使你不需要这些,也不可能。 如果你从现场访问开始,它将更难改变。

在Java中,使用getter和setter通常被认为是最佳实践。

这是因为如果您在访问或修改属性时需要更改代码以执行其他操作,则可以在现有的getter或setter中更改它。

我倾向于认为它会导致简单对象的混乱,但如果你曾经不得不将公共属性重构为getter和setter以添加其他function,你会发现它可能会很痛苦。

我怀疑大多数人会说总是使用getter / setter来访问私有成员。 这没有必要,但被认为是“最佳实践”。

一个优点是,您可以拥有的不仅仅是简单的分配和返回。 例:

 public void setLevel(int lvl) { if (lvl<0) { this.level=1; } else this.level = lvl; } public int getLevel() { if (this.someIndicator==4) return this.level*7.1; else return level; } 

Getters和Setters允许您稍后更改实现(例如,执行更复杂的操作),允许您实现validation规则(例如,如果名称不超过5个字符,则setName会抛出exception,无论如何。)

您也可以选择添加getter而不是setter,以便变量类似于“只读”。

这是理论,但在许多情况下(例如Hibernate使用setter)你不能在setter中抛出exception,所以你不能进行任何validation。 通常,该值将被分配/返回。 在我工作的一些公司中,必须为所有属性编写getter和setter。

在这种情况下,如果要从对象外部访问属性,并且希望它是可读/可写的,我只使用公共属性。 它的代码更少,这意味着你可以编写像obj.var += 5这样的东西比obj.setVar(obj.getVar() + 5)更容易阅读。

如果你的意思是:何时使用公共访问器方法而不是公开内部私有变量,我的答案是“总是”,除非有严重的性能原因。

如果你的意思是,调用你自己的get和set方法vs直接访问你class级中的vars,我仍然会说你自己的访问方法。 这样,您作为get / set的一部分实现的任何转换,编辑或规则都会由您自己的内部调用以及外部调用者自动调用。

在纯OO语言中(例如,Smalltalk),没有公共概念 – 所有内部变量都是私有的,因此您必须使用访问器。 在不太纯粹的OO语言中,您可以公开 – 但是从长远来看,暴露数据结构和实现的内部对于稳定性和维护来说是一个非常糟糕的主意。 查看“紧耦合”了解更多信息。

简单地说,如果您公开公开内部变量,人们可以直接访问它们,如果您更改名称或在换行符下键入所有内容。 这称为副作用。

这是一个品味问题,但一般来说,你总是应该对所有公共属性使用get / set方法。 但对于像Value Objects(VO)这样的东西,你可能不会被打扰一段时间,你可以使用公共变量而不会受到太多的批评我认为。

通常,您希望使用setter和getter为开发人员提供机会,通过修改代码或扩展代码来添加代码,以便在访问和修改内部数据时添加处理和控制层。 使用直接访问时,这在Java中是不可能的。

括号:但是,在其他语言中,例如在Scala中,当属性和方法之间的界限变得非常精细时,它是完全可能的。 它很棒,因为它不会成为阻碍编码问题的方式,它会使使用更加透明。


你也可以经常考虑在你的课堂上你可以直接访问你的内部(私人或受保护)成员,因为你应该知道你在做什么,而你不需要承担额外的开销。另一种方法调用。

在实践中,在一个class级上工作的多个人可能不知道每个人在做什么,并且在大多数情况下,你的getter和setter中的那些完整性检查线可能是有用的,而微优化可能不是。


此外,只有一种方法可以直接访问变量,而您可以根据需要定义多个访问器。

封装类的私有字段,并以您希望的方式使用getter / setter类公开它们。