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

时间:2015-11-01 06:44:42

标签: java c# scala

如果我不需要进行任何检查(在吸气期间)或更新其他东西(在制定者中),那么拥有一个简单的公共成员变量就足够了吗?

4 个答案:

答案 0 :(得分:3)

只要有可能,你应该避免使用setter,甚至在处理引用时使用getter。除非由于某些特殊原因无法做到,否则应始终优先选择不变性。在Java中,我个人更喜欢有吸气剂,即使我没有在那里做任何检查,它只是给了一点控制。

答案 1 :(得分:1)

如果您不需要检查价值或更新价值,请将其设为私有,并且不提供任何其他访问权限。

我个人的理念是只在需要时公开访问功能,然后,不一定提供设置和成对,甚至。

当您需要对传入值进行安全检查或在何种条件下读取变量时,

getter和setter都很好。

当你有一个带有大量原语的简单对象时,它们很糟糕,只需要将一个地方捆绑在一起。在那些情况下,我更喜欢公共成员。

答案 2 :(得分:1)

请注意,在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

This answer对其他语言(C#,Python,...)中的类似(非等效)概念进行了解释,其中您可以拥有property:一对方法(getter和/或者是一个二传手。)

正如艾略特指出的那样,当你在课堂上有不变性时,制定者就没有意义了。甚至在像Java这样的语言中,你可以编写一个getter,但我可以说你通常可以使用final public属性,因为你可以通过构造函数改变它们的值,尽管我不会把它称为“Java方式” “(笑):

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;
  }
}

答案 3 :(得分:0)

如果你做的事情很简单,那么公开是最实际的。

正如Jameson所提到的,有时你只需要getter或者只需要setter(String.getCharAt()等等......)。

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