在Scala中默认公开实例变量的理念是什么?

时间:2011-12-07 09:35:07

标签: scala

在Scala中默认使实例变量公开的理念是什么。默认情况下不应该将它们设为私有,这会使开发人员减少错误并鼓励构图吗?

4 个答案:

答案 0 :(得分:11)

首先,你应该知道写作时:

class Person( val name: String, val age: Int ) {
   ...
}

nameage不是实例变量,而是访问器方法(getters),默认情况下是公共的。

如果你写的话:

class Person( name: String, age: Int ) {
   ...
}

nameage只是实例变量,它们是您可以预期的私有变量。

Scala的哲学是更喜欢不可变的实例变量,然后使用公共访问器方法不再是一个问题。

答案 1 :(得分:5)

私人鼓励巨石。一旦将不相关的功能放入类中就更容易,因为它需要读取一些恰好是私有的变量,所以类开始增长。

这只是一个错误的默认值,也是Java中超过1000行的类的重要原因之一。

Scala默认为immutable,它删除了一大类错误,人们经常使用私有来限制(但不能删除,因为类本身的方法仍然可以改变变量)。

答案 2 :(得分:3)

  1. 使用在许多地方首选的不可变项,公众并不是一个问题
  2. 您可以在不更改客户端代码的情况下使用getter和setter替换公共val,因此您不需要额外的getter和setter层以防万一。 (实际上你确实得到了那个层,但你大部分时间都没注意到它。)
  3. 私有字段+公共setter和getter的java反模式无论如何都没有封装

答案 3 :(得分:3)

(补充其他答案的补充观点:)

Java封装字段背后的一个主要驱动因素是统一访问策略,即您不必知道或关心某些内容是仅仅作为字段实现,还是通过即时方法计算。这个问题的重要优点是所讨论的类的维护者可以根据需要在两者之间切换,而不需要修改其他类。

在Java中,这需要通过方法访问所有内容,以便在需要时提供语法灵活性来计算值。

在Scala中,可以通过等效的语法访问方法和字段 - 所以如果你现在有一个简单的属性,那么封装就不会直接暴露它,因为你可以选择在没有arg方法的情况下将其公开您的呼叫者需要了解有关更改的任何信息。