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

在Scala中默认公开实例变量背后的原理是什么?,scala,Scala,在Scala中默认公开实例变量背后的原理是什么。默认情况下,将它们私有化不应该让开发人员减少错误并鼓励合成吗?首先,您应该知道,在编写时: class Person( val name: String, val age: Int ) { ... } name和age不是实例变量,而是默认为公共的访问器方法(getter) 如果你改写: class Person( name: String, age: Int ) { ... } name和age只是实例变量,正如您所期望的,它们是

在Scala中默认公开实例变量背后的原理是什么。默认情况下,将它们私有化不应该让开发人员减少错误并鼓励合成吗?

首先,您应该知道,在编写时:

class Person( val name: String, val age: Int ) {
   ...
}
name
age
不是实例变量,而是默认为公共的访问器方法(getter)

如果你改写:

class Person( name: String, age: Int ) {
   ...
}
name
age
只是实例变量,正如您所期望的,它们是私有的


Scala的理念是更喜欢不可变的实例变量,那么拥有公共访问器方法就不再是问题了

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

这只是一个糟糕的默认值,也是Java中类超过1000行的主要原因之一

Scala默认为immutable,它删除了Java中人们经常使用private来限制(但不能删除,因为类自己的方法仍然可以改变变量)的大量错误类

  • 由于许多地方都喜欢使用不可变的,所以公共服务并不是什么大问题
  • 您可以使用getter和setter替换公共val,而无需更改客户机代码,因此不需要额外的getter和setter层,以备不时之需。(事实上,你确实得到了那一层,但大多数时候你都没有注意到。)
  • 私有字段+公共setter和getter的java反模式并没有封装太多内容
  • (补充其他答案的附加视图:)

    Java封装字段背后的一个主要驱动因素是统一访问策略,也就是说,您不必知道或关心某个内容是作为字段实现的,还是通过动态的方法计算的。这样做的最大好处是,所讨论的类的维护者可以根据需要在这两个类之间切换,而不需要修改其他类

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


    在Scala中,可以通过等效语法访问方法和字段-因此,如果您现在有一个简单的属性,那么直接公开它的封装不会有任何损失,因为您可以选择稍后将其作为无参数方法公开,而无需您的调用方知道有关更改的任何信息。

    在第二个示例中,
    name
    age
    也可能只是构造函数参数,而不是实例变量,具体取决于它们在
    Person
    主体中的使用方式。