文档章节

函数式对象之介绍

柳哥
 柳哥
发布于 2014/06/06 14:11
字数 1052
阅读 79
收藏 0

函数式对象这系列blog的重点在于定义函数式对象,也就是说,不具有任何可变状态的对象的类。为了便于说明和演示,我们将创造若干以有理数作为不可变对象来建模的类版本。在此过程中,我们会学习scala面向对象编程的更多知识:类参数构造函数方法操作符私有成员重写先决条件检查重载自指向

类Rational的规格说明书

有理数是一种可以表达为比率n/d的数字,这里的n和d是数字,其中d不能为零。n被称作分子,d被称作分母。有理数的例子有:1/2,2/3。
本章我们将要设计的类必须建模有理数的行为,包括允许它们执行加、减、乘、除运算。数学上有理数不具有可变的状态,有理数可以相加减,但结果是新的有理数,原来的数不会被改变。我们本章设计的不可变Rational类将秉承这一属性。每个有理数都能被表示成Rational对象,当两个Rational对象相加减时,将创建新的带着加减结果的Rational对象。

创建Rational类

着手设计Rational类之前应先考虑客户程序员将如何创建新的Rational对象。假如我们已经决定让Rational对象是不可变的,我们将需要那个客户在创建实例时提供所有需要的数据(本例中是分子、分母)。因此,我们应该这么开始设计:

package scalaTest
class Rational(n:Int,d:Int)

这行代码里首先应当注意到的是如果类没有主体,就不需要指定一对空的花括号(当然你如果想的话也可以)。在类名Rational之后的括号里的n和d,被称为类参数Scala编译器会收集这两个类参数并创造出带同样的两个参数的主构造器
另外,scala编译器将把类内部的任何既不是字段不是方法定义的代码编译至主构造器中。例如:

class Rational(n:Int,d:Int) {
    println("Created " + n + "/" + d)
}

scala编译器将把这段代码的println调用放进Rational的主构造器。因此,println调用将在每次创建新的Rational实例时打印这条信息。如:

不可变对象的权衡
不可变对象提供了若干强于可变对象的优点和一个潜在的缺点
首先,不可变对象常常比可变对象更易理清头绪,因为它们没有会随着时间变化复杂的状态空间。其次,你可以很自由地传递不可变对象,但对于可变对象来说,传递给其他代码之前,需要先建造个以防万一的副本。第三,一旦不可变对象完成构造之后,就不会有线程因为并发访问而破坏对象内部状态。因为根本没有线程可以改变不可变对象的状态。第四,不可变对象让哈希表键值更安全。比方说,如果可变对象在进入HashSet之后被改变,那么你下一次查找这个HashSet时就找不到这个对象了。不可变对象唯一的缺点就是有时需要复制很大的对象而可变对象的更新可以在原址发生。有些情况下这会变得难以快速完成而可能产生性能瓶颈。因此,要求功能库提供不可变类的可变版本也并非是一件稀奇的事情。例如:类StringBuilder是不可变的String的可变版本。

注意
这个Rational例子凸显了Java与scala之间的不同。Java类具有可以带参数的构造器,而scala类可以直接带参数。Scala的写法更简洁------类参数可以直接在类的主体中使用,没必要定义字段然后写赋值函数把构造器的参数复制到字段里

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 206
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
如何用十分钟学会函数式 Python?

函数式编程到底是什么?本文将详解其概念,同时分享怎样在 Python 中使用函数式编程。主要内容包括列表解析式和其他形式的解析式。 函数式模型 在命令式模型中,执行程序的方式是给计算机一系...

CSDN资讯
09/22
0
0
(转)现代C++函数式编程

本文转自:http://geek.csdn.net/news/detail/96636 {public: { 评论 添加评论 发布链接 发布图文 返回顶部 发布到 主题 发布 评论

wangxiaocvpr
2016/08/22
0
0
F#探险之旅(四):面向对象编程(中)

F#系列随笔索引 对象表达式(Object Expressions) F#中的OOP语法很简洁,而对象表达式则正是这种简洁性的核心所在。通过对象表达式,我们可以创建抽象类或接口的轻量级实现,也可以对一个具...

长征3号
2017/12/13
0
0
C#温故而知新系列 -- 闭包

闭包的由来 要说闭包的由来就不得不先说下函数式编程了。近几年函数式编程也是比较火热,我们先来看看函数式编程的一些基本的特性这个有助于我们理解闭包的由来。 函数式编程 函数式编程是一种...

rstaryan
03/30
0
0
JavaScript 详解:为什么写好的代码非常重要

this 适合你吗? 我看到许多文章在介绍 JavaScript 的 this 时都会假设你学过某种面向对象的编程语言,比如 Java、C++ 或 Python 等。但这篇文章面向的读者是那些不知道 this 是什么的人。我...

CSDN资讯
11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

函数计算工具链新成员 —— Fun Local 发布啦

刚刚,我们发布了函数计算工具链的新成员,Fun Local。欢迎大家使用! 如果你还不了解 Fun 是什么,我们来简单解释下。 Fun 是什么 Fun 是 have Fun with Serverless 的缩写,是一款 Server...

阿里云官方博客
1分钟前
0
0
Linux下实现 OpenSSL 简单加密与解密字符串

场景 shell脚本中存在明文密码 客户要求禁止使用明文密码,密码做加密处理. 方案 在网上了解到了Linux OpenSSL加密解密工具 可以指定各种加密算法为字符,文件做加密处理. 加密的案例比较多,解...

问题终结者
4分钟前
0
0
ActiveMQ 消息中间件

什么是ActiveMQ ActiveMQ是Apache出品,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2E...

ashuo
8分钟前
0
0
详解ECMAScript typeof用法

typeof 返回变量的类型字符串值 、其中包括 “object”、“number”、“string”、“undefined”、“boolean”、 1、在变量只声明、却不初始化值 Or 在变量没有声明时 返回 “undefined” > ...

peakedness丶
9分钟前
0
0
函数计算性能福利篇(二) —— 业务冷启动优化

继前一篇《函数计算性能福利篇——系统冷启动优化》,我们再来看看近期函数计算推出的 Initializer 功能之后,带来的一波高能性能优化成果。 背景 函数计算是一个事件驱动的全托管 serverle...

阿里云云栖社区
14分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部