您的位置 首页 java

Scala的构造函数及和Java的区别

让我们从一个熟悉的 Java 的例子开始。

假设有一个Person类,包括名字和国籍两个字段。那么在Java里我们会这么写:

 class Person {
   private  String name;
  private String country;
  
  public Person(String name, String country) {
    this.name = name;
    this.country = country;
  }
}  

相对应的Scala代码最简化的样子可以这么写:

 class Person(name: String, country: String)  

这里不再提老生重谈的代码行数问题。而是讲讲里面的设计哲学。

简洁性

第一个点,我认为作者对于“简洁”这个点是有狂热的追求的,《Programming in Scala》一书中反复提到“concise”这个词,光前6章,就有26次之多!

为了实现简洁性,我们假设,大家都更多的使用不可变数据结构,那么这个name和country相当于都是final的,而且,不可变数据结构的初始化需要一次性完成,那么最简单的实现就是一个所有字段都塞在 构造器 中。

那么Java代码中的这句:public Person(String name, String country)就可以去掉了,其实我们把public替换成class,把变量类型放在变量的后面,就是 Scala 的写法了。

封装

面向对象,或者说编程最重要的点(没有之一)就是封装。

在刚才的例子中,假设已经实例化了一个Person对象,我们叫p好了。实际上,我们无法通过p.name直接访问对应的名字,因为在Person这个类中,其实并没有name这个字段。

刚才的写法和Java只是等价,并不是等同。

如果要访问name,比如在 toString 里面打印出来,是可以的,但是直接访问不行。

我认为这样的设计,更符合封装的要求。也就是说,外界没理由直接访问name字段,如果要访问,则通过方法调用来实现。

这样的name字段被称为class parameter。相对的,其实我们也可以在类中定义name和country两个真正的字段。不过这样的话,和Java的繁琐程度倒是区别不大了。

主构造函数

在Scala中,是有主构造器(primary constructor)这样的说法的,来看看Martin怎么说:

也就是说,在类的结构体里面,除了字段和方法,其他的所有代码,都会被当做主构造器。这一点和Java有很大的区别。

在Java中,如果有多个构造器,我们不会明确的区分主次。

比如如果我们有一个新的 构造函数 ,当没有输入国家时,默认用中国作为国籍。我们可以这么写:

public Person(String name)

辅助构造函数

当然,在Scala中,我们也可以定义辅助函数,只不过在语法上,必须通过def this(…)这样的形式来写。

这里有一个很大的差别是,辅助构造函数,必须只能调用其他辅助构造函数或者主构造函数。 甚至连调用父类的构造函数也不行。

因此,我们说: 主构造函数,是进入一个类的唯一入口。

其中的取舍,还是为了最开始提到的“简洁性”。

文章来源:智云一二三科技

文章标题:Scala的构造函数及和Java的区别

文章地址:https://www.zhihuclub.com/188162.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图