When to use get/set Methods in java
我想知道在我的类中什么时候使用get和set方法(getname,setname),什么时候使用简单的
下面是使用set和get方法的类示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
谢谢
使用getter/setter与使用字段
根据经验:
直接从同一个类中使用变量(实际上来自同一个.java文件,因此内部类也可以),使用来自其他类的GETSt/Stutter。
简单的规则是:永远不要使用直接访问(当然,从类内引用它们时除外)。
- 无法代理字段访问
- 您可能需要一些事件通知
- 你可能想防止比赛条件
- 表达式语言支持setter和getter
- 理论上,这会破坏封装。(如果我们是书呆子,那么所有字段的setter和getter也会破坏封装)
- 您可能希望在setter或getter中执行一些额外的逻辑,但这很少是明智的,因为消费者希望这样做遵循惯例,即成为一个简单的getter/setter。
- 只能指定setter或getter,从而实现只读或只写访问。
即使你不需要这些,也不可能。如果您从字段访问开始,则很难进行更改。
在Java中,使用吸气剂和设定器通常被认为是最佳实践。
这是因为,如果在访问或修改属性时需要更改代码来执行其他操作,则可以在现有的getter或setter中更改它。
我倾向于认为它会给简单对象造成一些混乱,但是如果您曾经需要将公共属性重构为getter和setter来添加额外的功能,那么您会发现这可能是一种痛苦。
我怀疑大多数人会说总是使用getter/setter来访问私有成员。这是不必要的,但被认为是"最佳实践"。
一个好处是,你不仅可以有简单的分配和返回。例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; } |
getter和setter允许您稍后更改实现(例如,做一些更复杂的事情),允许您实现验证规则(例如,
您也可以选择添加getter而不是setter,这样变量就类似于"只读"。
这就是理论,但是在许多情况下(例如使用setter的hibernate),您不能在setter中抛出异常,因此您不能进行任何验证。通常只分配/返回该值。在我工作过的一些公司中,必须为所有属性编写getter和setter。
在这种情况下,如果您希望从对象外部访问属性,并且希望它是可读/可写的,那么我只使用公共属性。它的代码更少,这意味着你可以编写像
如果您的意思是:何时使用公共访问器方法而不是使内部、私有变量成为公共变量,那么除非有严重的性能原因,否则我的答案是"始终"。
如果你的意思是,调用你自己的get和set方法vs直接访问vars w/在你的类中,我还是说调用你自己的访问方法。这样,您作为get/set的一部分实现的任何转换、编辑或规则都会被自己的内部调用和外部调用程序自动调用。
在纯OO语言(例如smalltalk)中,没有公共概念——所有内部变量都是私有的,因此必须使用访问器。在不太纯粹的OO语言中,您可以将事情公开化——然而,从长远来看,公开数据结构和实现的内部结构对于稳定性和维护来说是一个非常糟糕的主意。有关这方面的更多信息,请参阅"紧耦合"。
简单地说,如果您公开内部变量,人们可以直接访问它们,如果您曾经更改名称或在换行符中键入所有内容。这叫做副作用。
通常,您希望使用setter和getter为开发人员提供机会,通过修改或扩展代码来重用代码,从而在访问和修改内部数据时添加处理层和控制层。在使用直接访问时,这在Java中是不可能的。
括号:但是,在其他语言中是完全可能的,例如在scala中,当属性和方法之间的行变得非常好时。这很好,因为这样它就不会成为一个妨碍使用的编码问题,并且使使用更加透明。
您还可以经常考虑,在类中,您可以自由地直接访问内部(私有或受保护)成员,因为您应该知道自己在做什么,并且不需要招致另一个方法调用的开销。
实际上,在一个类中工作的多个人可能不知道每个人都在做什么,并且在大多数情况下,getter和setter中的完整性检查行可能有用,而微观优化可能不有用。
此外,只有一种方法可以让您直接访问变量,而您可以定义任意多的访问器。
这是一个品味问题,但一般来说,对于所有公共属性,您都应该使用get/set方法。但是对于像价值对象(vos)这样的东西,你可能一段时间内不会被打扰,我认为你可以使用公共变量而不会受到太多的批评。
封装类的私有字段,并以您希望的方式用getter/setter类公开它们。