课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习计算机编程开发技术,下面我们就通过案例分析来了解一下,软件开发集合与事务的概念与应用。
为了保证不可变性,我们采取的 一个步骤是将单纯用来保存数据的类(value classes)及其内部所有成员字段都置为final(在Scala中是val)。然后,我们需要传递地保证我们自己定义的类里面的字段所使用的类也都是不可变的。可以说,将字段和类的定义置为final这一步是整个过程的基础,这同时也是避免并发问题的 一步。
虽说不可变性可以使代码变得又好又安全,但是由于性能问题,程序员们还是不大愿意使用这一特性。其症结在于,为了维护不可变性,我们可能在数据没发生任何变动的情况下也要进行拷贝操作,而这种无谓的拷贝对性能伤害很大。为了解决这个问题,我们在3.6节中曾经讨论过持久化数据结构以及如何使用这类数据结构来减轻程序在性能方面的负担。而在持久化数据结构的实现方面,已经有很多现成的 三方库可供使用,而Scala本身也提供了这类数据结构。由于Java也有实现好的持久化数据结构可用,所以我们就无需专门为使用这个特性而去换用自己不熟悉的语言。
除了不可变性之外,我们还希望能获得一些事务运行所需要的数据结构——这些数据结构的值是不可变的,但其实体可以在托管事务中被改变。Akka提供了两种托管数据结构——TransactionalVector和TransactionalMap。这两种数据结构源自于高效的Scala数据结构,其工作原理和Java的list、map类似。
在updateScore()函数中,我们把设置某个运动员的得分以及增加更新次数的操作都收敛到一个事务里面,该事务中所用到的TransactionalMap类型的scoreValue字段以及Ref类型updates字段都是托管类型。其中TransactionalMap支持普通Map的所有函数,只不过这些函数都是事务性的——即一旦事务回滚,我们对其进行的任何变更都将被丢弃。为了能够观察到实际的效果,我们人为地设置了一个回滚条件,即当得分为13的时,我们会先完成变更操作,然后抛异常令事务回滚。
在Java中,如果集合类实现了Iterable接口的话,我们就可以使用像for(String name: collectionOfNames)这样的for-each语句。但TransactionalMap是一个Scala集合类,并且没有直接支持这个接口。别担心——Scala提供了一个叫做javaConversions的门面(façade设计模式——译者注),该门面提供了很多方便的函数来获取我们想要的Java接口。例如,我们可以使用asJavaIterable()函数来获取原本需要使用getNames()函数才能拿到的接口。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。