加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala应用程序的设计中实现不变性?

发布时间:2020-12-16 19:20:20 所属栏目:安全 来源:网络整理
导读:作为 scala和当前 java开发人员的新手,scala旨在鼓励将不变性用于类设计. 这实际上如何转化为类的设计?我想到的唯一一件事就是案例类.是否强烈鼓励案例类定义数据?例?在Scala设计类中,如何鼓励不变性? 作为java开发人员,定义数据的类是可变的.应该将等效
作为 scala和当前 java开发人员的新手,scala旨在鼓励将不变性用于类设计.

这实际上如何转化为类的设计?我想到的唯一一件事就是案例类.是否强烈鼓励案例类定义数据?例?在Scala设计类中,如何鼓励不变性?

作为java开发人员,定义数据的类是可变的.应该将等效的Scala类定义为案例类?

解决方法

好吧,案例类肯定有帮助,但最大的贡献者可能是集合库.默认集合是不可变的,并且这些方法适用于通过生成新集合而不是变异来操纵集合.由于不可变集合是持久的,因此不需要复制整个集合,这是 Java中经常需要做的事情.

除此之外,for-comprehensions是monadic理解,它有助于执行不可变任务,有尾递归优化,这在不可变算法中非常重要,并且在许多库中一般关注不变性,例如解析器组合器和xml.

最后,请注意,您必须要求var才能获得一些可变性.参数是不可变的,val和var一样短.与Java相比,参数是可变的,你需要添加一个final关键字来获得不变性.而在Scala中,保持不变是容易或容易的,而在Java中,保持可变性更容易.

附录

Persistent data structures是在其修改版本之间共享部分的数据结构.这可能有点难以理解,所以让我们考虑Scala的List,这是非常基本且易于理解的.

Scala列表由两个类组成,称为cons和Nil.前者实际上是在Scala中编写的::但我会用传统名称来引用它.

Nil是空列表.它不包含任何东西.依赖于列表不为空的方法,例如head和tail throw异常,而其他方法可以正常工作.

当然,缺点必须代表非空列表.实际上,cons只有两个元素:值和列表.这些元素称为头部和尾部.

因此,包含三个元素的列表由三个缺点组成,因为每个缺点只包含一个值,加上一个Nil.它必须为零,因为缺点必须指向列表.由于列表不是循环的,因此其中一个缺点必须指向缺点之外的东西.

这种列表的一个例子是:

val list = 1 :: 2 :: 3 :: Nil

现在,Scala列表的组件是不可变的.人们不能改变缺点的价值和清单.不可变性的一个好处是,您无需在传递之前或从其他方法接收之后复制集合:您知道列表不能更改.

现在,让我们考虑如果修改该列表会发生什么.让我们考虑两个修改:删除第一个元素并添加一个新元素.

我们可以使用方法tail删除一个元素,其名称根本不是巧合.所以,我们写道:

val list2 = list.tail

list2将指向列表尾部指向的相同列表.什么都没有创建:我们只是重复使用列表的一部分.那么,让我们将一个元素添加到list2然后:

val list3 = 0 :: list2

我们在那里创造了新的缺点.这个新缺点的值(头部)等于0,其尾部指向list2.请注意,list和list3都指向相同的list2.列表和列表3共享这些元素.

还有许多其他持久性数据结构.您正在操作的数据是不可变的这一事实使得共享组件变得容易.

人们可以在Chris Okasaki,Purely Functional Data Structures的书中找到关于这个主题的更多信息,或者在同名的免费thesis上找到关于这个主题的更多信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读