文档章节

函数式对象之介绍

柳哥
 柳哥
发布于 2014/06/06 14:11
字数 1052
阅读 77
收藏 0
点赞 0
评论 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的写法更简洁------类参数可以直接在类的主体中使用,没必要定义字段然后写赋值函数把构造器的参数复制到字段里

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 202
博文 394
码字总数 347782
作品 0
杭州
技术主管
Scala的函数式编程

Scala的函数式编程 昨天去一家公司面试,额,他们想招erlang的开发人员,然后我会点scala,都是函数式语言么。所以就让我过去试试了,开始介绍了一些在做的项目架构什么的。最后开始跟我聊函...

ForEleven ⋅ 2013/09/04 ⋅ 0

Java8 Lambda - Functioanl Interface 函数式接口

在java 8 里面新增了functional interface 这个概念。并且添加了新的annotation @FunctionalInterfaceI 1 什么是functional interface 函数式接口了? functional interface : functional in......

vjjy001 ⋅ 2016/10/04 ⋅ 0

(转)现代C++函数式编程

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

wangxiaocvpr ⋅ 2016/08/22 ⋅ 0

F#探险之旅(四):面向对象编程(中)

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

长征3号 ⋅ 2017/12/13 ⋅ 0

Javascript作用域原理(转)

问题的提出 首先看一个例子: var name = 'laruence';function echo() { } echo(); 运行结果是什么呢? 上面的问题, 我相信会有很多人会认为是: laruenceeve[脚本出错] 因为会以为在echo中, 第...

菜到没谱 ⋅ 2013/01/24 ⋅ 2

java8之lambda介绍

Java是一门面向对象编程语言。面向对象编程语言和函数式编程语言中的基本元素(Basic Values)都可以动态封装程序行为:但这个相同点并不明显,因为Java的对象往往比较“重量级”:实例化一个...

那位先生 ⋅ 2016/02/19 ⋅ 0

fluent python- 5 一等函数-面向对象(附第四章-文本和字节序列)

第 4 章 文本和字节序列 人类使用文本, 计算机使用字节序列。 第 5 章 一等函数 前言: 在 Python 中, 函数是一等对象。 编程语言理论家把“一等对象”定义为满足下述条件的程序实体: 1、...

时间之友 ⋅ 2017/12/03 ⋅ 0

Promise是Monad吗?

译者按: 近年来,函数式语言的特性都被其它语言学过去了。 原文: Functional Computational Thinking — What is a monad? 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本...

Fundebug ⋅ 2017/06/27 ⋅ 0

全面理解面向对象的 JavaScript

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

IBMdW ⋅ 2013/04/21 ⋅ 6

深入浅出 JavaScript 中的 this

在 Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象。一般在编译期确定下来,或称为编译期绑定。而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的,这就...

idea_biu ⋅ 2012/09/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 58分钟前 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部