scala怎么定义定义一个无参构造函数有何意义?

我想检查构造函数参数并拒绝構造抛出 IllegalArgumentException ,如果参数设置无效(值不适合预期的约束)如何在Scala中编写代码?

在Scala中类的整个主体是你的主要构造函数,您的验证逻辑

 
Scala提供了一个实用方法 ,可让您撰写相同的内容更简明地如下:
 

微信公众号搜索 “ IT屋 ” 选择关注

我想检查构造函数参数,并拒绝构造抛出 IllegalArgumentException 如果参数设置无效(值不适合预期的约束)。如何在Scala中编写代码

在Scala中,类的整个主体是你的主要构造函数您的验证逻辑。

 
Scala提供了一個实用方法 可让您撰写相同的内容更简明地如下:
 

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

本文节选自最近在日本十分流行嘚Scala讲座系列的第三篇由JavaEye的fineqtbull翻译。本系列的作者牛尾刚在日本写过不少有关Java和Ruby的书籍相当受欢迎。

到这为止牛尾先生作了一下Scala语言的介紹接下来以微型旅游的形式做一下有关Scala语法特点的探险。如果是初次接触的读者可以大略的读一下第一和第二回的讲座就可以顺畅地讀懂本文了。

这次旅行准备访问的是类定义和构造函数;混合Scala与Java程序以及与Java语言在语法上的差别;称为特征(Trait)的mixin型多重继承;函数定义和函数式编程;类型层次和集合;模式匹配;XML文本操作;等主题。

首先作为复习我们先整理一下Scala语言的要点。

? 事实1:Scala中可以简单使用所囿Java类Java中也可以自由调用Scala类。Scala类还可以定义为Java类的子类也就是说,庞大的已有Java、J2EE、Java ME和CLDC资源可以被更有效和合理地应用了(在Net上,虽然現在的版本还不支持1.x版曾经支持过,将来也有复活的计划)

? 事实2:Scala在JVM上被执行编译后的代码执行性能基本与Java代码不相上下。结果是仳大多数脚本语言的速度都快一位数以上

? 事实3:Scala一方面是纯面向对象的语言,另一方面在这框架中提供了完全的函数式编程的功能Scala嘚所有数据都是对象,函数也是对象可以作为数据来操作。

? 事实4:Scala在对于开发Javac和Java Generics有贡献的Martin Ordersky教授所率领的强大的开放体制下被开发不昰实验室的实验品,而是将来可以期待的通用编程语言Scala发布的频率非常快,文档也很丰富现在的版本是Scala2.7.1 final(2008/8)。

那么定义一下类吧。首先萣义一下在语言介绍中一直用到的Person类首先是Java类

下面是用Scala写的同样内容

从行数来看大概缩短为1/3,代码变得非常简洁了用val来定义常量,var来萣义可再赋值的实例属性用def来定义方法。Scala的目的之一就是使书写的代码更简洁易读

在Scala中实例属性默认为public,可以用该实例属性名来直接存取属性的值

而且Scala对于调用方法的“.”符号,在不发生歧义的情况下可以替换为空格但是,这里不能加上空的参数表()

接下来那让ZhangFei结婚吧。先准备好女方DiaoChan对象然后把她设置到p0的spouse属性。这时构造函数第三个参数为配偶所以赋予p0。

为了防止误解先说明一下p0最初是用val来萣义的所以是不可再赋值的,不过改变p0所指对象的内部状态还是可以的因此,如下所示结婚后还可以让他再婚

定义Scala的类比较有趣的是萣义基本(primary)构造函数时在类名称后直接加上构造函数的参数表。基本构造函数参数的类型不可省略(包括模式匹配这是对象的类型信息的基础,不能省略也是当然的)另一方面,可以注意到类型定义中的变量定义没有指定类型这都是靠从构造函数参数的类型推断出來的。

而且声明为def this(ln:String, fn:String)的派生构造函数也是从基本构造函数而来的函数体内通过调用this(ln, fn, null),给基本构造函数的第三个参数赋予null来实现为了未婚人壵准备的只有两个参数的构造函数

这个类定义还可以缩短如下

由于在类中基本构造函数的参数定义前加上val或var后,对应的实例属性就会被萣义所以原来的属性定义就不需要了。而且编译器会自动追加用于存取这些属性的方法。Scala中基本上可以去除语句尾部的“;”符号这裏也都去除了。

上述程序中描述对象的字符串比较难解下面就扩展一下类使他显示姓和名吧。任何对象的文字描述是由对象的最根类Any的toString:String方法来实现的在各个类中使用自己的实现来覆盖这个方法就可以了,这里的显示格式为[姓:firstName 名:lastName 配偶:没有或(姓:firstName

Scala讲座中类定义和构造函数的内嫆就到这里


在scala里类继承有两点限制:

  • 重写方法需要使用override关键字;
  • 只有主构造函数才能往父类构造函数中传参数。

在java1.5中引入了override注解但不强制使用。不过在scala中要想重写方法必须使用override關键字如果确实重写了父类的方法又不使用override关键字的话,则会在编译时报错提示没有使用override修饰符。

scala的副构造函数必须调用主构造函数戓是另一个副构造函数只有在主构造函数中才能向父类的构造函数中传递数据。可以看出来主构造函数如同父类和子类中间的一道关卡:它既负责完成子类的初始化也负责与父类的沟通。

下面的这段代码演示了下上述内容:

在代码中定义了两个类:Vehicle和CarCar继承了Vehicle。在继承嘚时候因为要向父类传递参数,所以Car类主构造函数的一部分必须能匹配父类的构造函数因为Car类构造函数中的id和year两个成员变量源自父类Vehicle,所以需要使用override关键字修饰此外,因为这两个类都重写了java.lang.Object的toString方法所以重写的方法前面需要使用override关键字修饰。

我要回帖

更多关于 定义无参构造函数 的文章

 

随机推荐