在大多数情况下,我们应该定义getter-setter吗
本文关键字:定义 getter-setter 我们 在大多数情况下 | 更新日期: 2023-09-27 18:20:08
如果我不需要进行任何检查(在getter期间)或更新其他内容(在setter期间),那么拥有一个简单的公共成员变量就足够了吗?
在处理引用时,应尽可能避免使用setter,甚至getter。除非由于某种特殊原因无法做到,否则应始终优先考虑不可更改性。在Java中,我个人更喜欢getter,即使我没有在那里做任何检查,它只会提供更多的控制。
如果不需要检查或更新值,请将其设为私有,并且不提供任何其他访问权限。
我个人的理念是,只有在需要的时候才公开访问功能,然后,甚至不一定要提供一组和一组。
当您需要对传入值进行安全检查或在什么条件下读取变量时,getter和setter是很好的。
当你有一个简单的对象,其中有很多基元,只需要一个地方就可以捆绑在一起时,它们就不好了。在这种情况下,我更喜欢公众成员。
请注意,在scala中,这个问题并不存在,因为scala会为您自动生成getter和setter方法:
class Person(var name: String)
val p = new Person("Jonh")
p.name = "James"
println(p.name) // James
然后,如果您需要覆盖默认的默认访问器和赋值器:
class Person(private var _name: String) {
def name = _name
def name_=(aName: String) { _name = aName }
}
仍然有效:
val p2 = new Person2("Jonh")
p.name = "James"
println(p.name) // James
这个答案解释了其他语言(C#、Python…)中类似(不等价)的概念,在这些语言中可以有一个property
:一对方法(getter和/或setter)。
正如Elliott所指出的,当你在课堂上有不变性时,二传手就没有意义了。即使在像Java这样的语言中,你也可以编写getter,但我可以说,你通常可以不使用final public
属性,因为你可以通过构造函数更改它们的值,尽管我不完全称之为"Java方式"(lol):
class Person {
public final int age;
public Person(int theage) {
// Let's transforme age here
// Imagine this could would go in the getter
age = theage * 2;
}
}
如果您正在做一些简单的事情,那么公共是最实用的。
正如詹姆森所提到的,有时您只需要getter或setter(String.getCharAt()等…)。
如果你正在做一个大项目,你至少应该做安全检查(詹姆森再次)。此外,在正确的地方使用它们会让你看起来很聪明,但这真的取决于你做了什么,也许共享一段代码?