在大多数情况下,我们应该定义getter-setter吗

本文关键字:定义 getter-setter 我们 在大多数情况下 | 更新日期: 2023-09-27 18:20:08

如果我不需要进行任何检查(在getter期间)或更新其他内容(在setter期间),那么拥有一个简单的公共成员变量就足够了吗?

在大多数情况下,我们应该定义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()等…)。

如果你正在做一个大项目,你至少应该做安全检查(詹姆森再次)。此外,在正确的地方使用它们会让你看起来很聪明,但这真的取决于你做了什么,也许共享一段代码?