文档章节

函数式对象之辅助构造器

柳哥
 柳哥
发布于 2014/06/06 16:26
字数 486
阅读 98
收藏 0

有些时候一个类里需要多个构造器。Scala里主构造器之外的构造器被称为辅助构造器。比方说,分母为1的有理数只写分子的话就更简洁。因此,Rational(5,1)简写成Rational(5)或许感觉会更好些。而这就需要给Rational添加只传入分子的辅助构造器并预先设定分母为1。如例:

package scalaTest
class Rational(n:Int,d:Int) {
    require(d != 0)
    val number:Int = n
    val denom:Int = d
    def this(n:Int) = this(n,1)    //辅助构造器
    override def toString = number + "/" + denom
    def add(that:Rational):Rational = {
        new Rational(number * that.denom + that.number * d , d * that.denom)
    }
    def lessThan(that:Rational) = {
        this.number * that.denom < that.number * this.denom
    }
    def max(that:Rational) = {
        if(this.lessThan(that)) that else this
    }
}

Scala的辅助构造器定义开始于def this(....)。函数主体几乎完全是主构造器的调用,并传递了参数n做分子和1做分母。Scala里的每个辅助构造器的第一个动作都是调用同类其它的构造器。换句话说就是,scala类的每个辅助构造器都是以“this(......)”形式开头的。被调用的构造器既可以是主构造器,也可以是其它已定义的辅助构造器。规则的根本结果就是每个scala的构造器调用终将结束于对主构造器的调用,因此主构造器是类的唯一入口点

注意
若熟悉java,你或许会奇怪为什么scala构造器的规则比java的还要严格。Java里构造器的第一个动作只有两个选择:要么调用同类的其他构造器,要么直接调用超类的构造器。Scala类里面只有主构造器可以调用超类的构造器。Scala里这种严格的限制实际上是为了让scala的构造器与java构造器相比更为清晰和简洁而付出的代价。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 0
杭州
技术主管
Scala笔记整理(四):Scala面向对象—类详解2(继承相关)

[TOC] 单例 希望某个类只存在一个使用的对象,而不管有多少个调用者在使用它,就是单例的概念。 Java中的单例 Scala中的单例 代码及说明如下: 输出结果如下: 伴生类和伴生对象 直接看下面的...

xpleaf
04/20
0
0
继承中子类的构造器调用父类的构造器

构造器的作用:初始化对象的成员变量。 构造器不能被子类继承,普通方法和属性可以被子类继承。 默认情况下,子类的构造器中的第一行隐式地调用父类默认的无参构造器,以初始化父类的成员变量...

恒者
2013/12/23
0
2
全面理解面向对象的 JavaScript

简介: JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征。本...

IBMdW
2013/04/21
1K
6
IoC容器的初始化过程(上)

首先明确以下三点: 下文中的"容器"若无特别,一律指"IoC容器" 严格来说,容器的初始化过程主要包括三个部分: BeanDefinition的Resource定位 BeanDefinition的载入和解析 BeanDefinition在容器中...

芥末无疆sss
2017/12/28
0
0
Scala内容总结回顾

Scala内容梳理 变量声明 定义方法和函数 条件控制语句和循环 条件控制语句 for循环 while循环,这种比较少用,一般用于无法判断结束次数的时候。 类的定义 主构造方法: 辅助构造器,重载主构...

刘付kin
2016/11/28
12
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring 容器实现对bean的管理(注解方式解析,源码阅读)

因为最近在研究学习spring boot,所以这里想详细学习回顾了一下spring 容器对bean的一些管理方式和部分源码学习。 首先初始类AnnotationConfigApplicationContext,简单源码查看,支持两个参...

小海bug
16分钟前
0
0
数据结构:二分查找 java

二分查找的前提是有序存储,利用顺序存储和元素排序 /** * 二分查找,查找成功,返回下标记 * @param values * @param begin * @param end * @param key * @param <T> * @ret...

京一
34分钟前
0
0
@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
47分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
今天
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部