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怎么说:
The Scala compiler will compile any code you place in the class body, which isn"t part of a field or a method definition, into the primary constructor.
也就是说,在类的结构体里面,除了字段和方法,其他的所有代码,都会被当做主构造器。这一点和Java有很大的区别。
在Java中,如果有多个构造器,我们不会明确的区分主次。
比如如果我们有一个新的构造函数,当没有输入国家时,默认用中国作为国籍。我们可以这么写:
public Person(String name) 辅助构造函数
当然,在Scala中,我们也可以定义辅助函数,只不过在语法上,必须通过def this(…)这样的形式来写。
这里有一个很大的差别是,辅助构造函数,必须只能调用其他辅助构造函数或者主构造函数。 甚至连调用父类的构造函数也不行。
因此,我们说:主构造函数,是进入一个类的唯一入口。
其中的取舍,还是为了最开始提到的"简洁性"。
三星发布S20系列新机和ZFlip,开手机8K录像先河三星于北京时间2月12日凌晨一口气甩出了GalaxyS20系列及ZFlip等多款新机其中今年的重磅旗舰新品S20系列共有三个型号,分别为GalaxyS205GS205G和S20Ul
CES2020微星展馆一览,从游戏到内容创作者系列产品应有尽有作为游戏硬件和计算解决方案的品牌,微星在CES2020上展出了屡获殊荣的游戏和内容创建者系列产品,涵盖笔记本电脑,台式机,显示器和DIY组件产品,包括世界上第一台真正的台式杀手级游
把命交给自动驾驶?理想ONE车主高速躺平玩手机最近,理想汽车的瓜实在有些多。闹得沸沸扬扬的水银门和生锈门还未有定论,一位理想ONE车主躺着开车的视频又引发了网友的热议,可谓是一波未平一波又起。从这位理想车主上传的视频可以看到,
落户北京,明年见?小米造车要跟特斯拉比速度近日,有消息人士称,小米汽车已经基本确认总部和首座工厂落户北京。从今年3月底,雷军正式官宣进军智能电动汽车行业后,关于总部和工厂选址的问题就一直是网友讨论的重点。各种传闻甚嚣尘上,
体积小散热强AOHi65WGaN氮化镓充电头使用体验手机厂商的快充需求促进了快充品牌与设备的发展,经过多轮产品轮换,目前最受欢迎的就是传说中的氮化镓GaN充电头了。什么是GaN氮化镓是一种新型半导体材料,具有禁带宽度大热导率高耐高温
平价降噪好声音DacomTinyPodsANC使用评测随着苹果发布了airpods,国产耳机厂商在真无线蓝牙耳机产品线有了长足的发展,不得不说有些品牌推出的高性价比产品值得一试。今天评测的产品就是Dacom大康旗下的一款真无线降噪耳机
一个月5千算不算多?我个人认为一个月5千真的不多,就拿我来说吧,5千真的不够!1。一个月5千如果是我自己花的话就可以,但是我觉得还不够为什么这么说呢?因为我要养一家人,父母一个月就给他们一两千,还有老
智能电动汽车又来搅局者重塑汽车产业链,芯片公司将如何搅局?文东篱车企要从骨子里头改变,这句话说起来容易,做起来难。清华大学汽车产业与技术战略研究院院长赵福全在某次闭门会议上表示,渐进式的创新一定不适合于
除了联手华为,车二代阿维塔们能不能走出自己的路?这一波新造车的浪潮,或许是留给车企的最后的时间窗口。文东篱汽车行业的未来机遇深藏在电动化智能化网联化共享化等浪潮之中,而中国正成长为全球汽车业电动化与智能化的领跑者。四五年前,李斌
12。99万元起BEIJINGEU5PLUS正式上市新车上市近日,BEIJINGEU5PLUS正式上市,新车依旧定位为纯电动轿车,全系有416km501km两种续航里程版本共四款车型可选,售价区间为12。9914。99万元。此外,官
同城货运,自动驾驶新战场?技术落地加速,政策何时赶上?文Toretto自动驾驶行业的商业化步伐没有停下来过。9月9日,自动驾驶公司文远知行WeRide发布中国首款L4级自动驾驶轻客(WeRideRobova