Atitit Immutability 和final的优点
Atitit Immutability 和final的优点
什么是 immutability? 其实细分起来有语法上的 immutable (例如 Java 里的 final 关键字), 和运行时对象的 immutable (一个变量名可以修改指向不同对象, 但对象的内容不可变). 两者的联系是: 如果语法上规定所有变量都是 "final" 的, 那么运行时对象就相当于都 immutable 了. 但如果语法上部分变量是 final, 部分不是, 那么就不能得出运行时对象全都 immutable 的结论.
而在运行时对象都是 immutable 的情形下, 很多优势才会显现出来.
- "immutability 会拖慢程序" 略扯淡, 应用了 immutability 的 VM 实现可以去掉很多情况的 lock, 并发处理速度会更快.
就算不是并发处理的情况, 如果所有对象都 immutable, 手动的保护性拷贝都可以去掉, 处理复杂业务会更简单快速.
其实编译器可以把很多 immutable 的操作改写成 mutable 的操作, RAM 能不能擦写没什么影响的. LLVM 中间语言就是个变量名 immutable 的语言, 但是编译出来的代码效率很高 --- 编译器就是这么贱, 你明明为了提高性能重复利用同一个变量, 但是它却偏偏要先把你写的单个变量改成多个变量单次赋值再去做优化...
对象实例 immutable 了 GC 能更简化. 因为只有新对象指向老对象, 老对象不能指向新对象, 对实现分代 GC 的人来说真是一个天堂! Haskell 和 Erlang 的分代 GC 实现都不复杂而且效率很高 (但 Clojure 因为是 JVM 上的二奶语言享受不到这个优惠, Scala 不是所有对象都 immutable, 只能起用接口限制程序员的效果了...)
在 immutable 的环境里还有什么好处? 就是没有环引用! 不用做环检测不用加弱引用, 那引用计数还不爽翻了? 是的... 有人用引用计数实现 Erlang 的, 写得非常爽... 我也在写一个语言, 所有变量 immutable, 就用引用计数做内存管理, 当引用数为 1 的时候还能做 destructive update, 节省一次内存分配释放, 也不损害 immutable 的语义哦 (巨坑中, stay tuned...).
immutable 的环境还能轻易实现 debug step back. 至今大部分语言和环境的 debugger 都没有后退功能, 而后退功能的实现难点主要是要保存对象变化的历史记录, mutable 的对象系统就得复制或者深复制对象才能恢复历史. 而 immutable 的环境里, 只要保留之前的对象的引用, 就能直接恢复.
immutability 至今表现还不太好的地方是哈希表, 例如 Haskell 的哈希表实现就一片混乱... 如果要实现一个高效的 immutable 并且保持插入顺序的哈希表... 你会比较蛋疼. 现在做得比较好的是 HAMT 或者 RRB tree, 但也没有 mutable 的哈希表快.
- immutable 会造成代码比较难写吗? 事实上就是思维方式要改变, 用更高阶的操作就好了, 然后你会发现经常变得更好写了. 而且 state monad + do notation 可以让你退回去用 mutable 的思维方式想问题, 而且, 这个 state 是严格控制在 local 的不会搅乱你其他部分的程序.
如果所有对象都 immutable, 那程序根本就没有传值和传引用的区别了, 学习起来更简单, 语义更一致 (但一心要当大杂烩的 Scala 反而变得很复杂...)
- 组件和对象会不会比 immutable 更适合 GUI 编程? 现状是 functional language 在 GUI 库上面还不够成熟, 但应用 functional 概念架构的 GUI 反而速度更快更稳定, 在 web 前端框架上面已经逐渐体现了, 例如 swannodette/om · GitHub 和 Raynos/mercury · GitHub. 用 Om 实现一个历史后退的功能真的清爽容易到了极点.
- 函数式语言中常用的 list 也受限于当前的 CPU 架构体系, locality 没有 array 好, 不过很多 list 中使用的 idiom 也可以直接应用到 array 上, 问题不大.
- 某些面向对象的方法论使用大量的隐喻, 使得不懂的人都可以以为自己懂了, 也许才是其最重要的优势吧.
分享
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit Immutability 和final的优点的更多相关文章
- 浅谈final关键字的用法
1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...
- Unit05 - 抽象类、接口和内部类(上)
Unit05 - 抽象类.接口和内部类(上) 1.static final常量: 1)必须声明同时初始化 2)通过类名来访问,不能被改变 3)建议:常量名所有字母都大写(多个单词间用_) 4) ...
- 208道面试题(JVM部分暂无答案)
这是从网上看到的一套java面试题, 答案只是一个大概, 另外题目质量参差不齐, 斟酌参考(JVM的部分暂时没有答案) 一.Java 基础 JDK 和 JRE 有什么区别? 答: JDK(Java D ...
- java内存模型(jMM)(二)
volatile关键字 volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量.volatile的作用是作为指令 ...
- t6_sumdoc
C:\Users\Administrator\Documents\sumdoc 2019\sumdoc t6 final\sumdoc t615C:\Users\Administrator\Docum ...
- Atitit 智能云网络摄像机的前世今生与历史 优点 密码默认888888
Atitit 智能云网络摄像机的前世今生与历史 优点 密码默认888888 用户名admin 密码aaaaaa 网络摄像机是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像通过网络传 ...
- Atitit.java相比c#.net的优点 优缺点 v2 q330
Atitit.java相比c#.net的优点 优缺点 v2 q330 1. 跨平台可在LINUX上,mac跑以外.主要如下: 1 2. IDE ECLIPSE(500m)是绿色的,换机器不用安装,C ...
- Atitit.guice3 ioc 最佳实践 o9o
Atitit.guice3 ioc 最佳实践 o9o 1. Guice的优点and跟个spring的比较 1 2. 两个部分:::绑定and注入@Inject 1 3. 绑定所有的方法总结 2 3. ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
随机推荐
- PHP对象转数组||PHP数组转对象
function arrayToObject($e){ if( gettype($e)!='array' ) return; foreach($e as $k=>$v){ ...
- JAVA里面的IO流(二)方法1、输入流
- 使用 xcode 8 构建版本 iTunes Connect 获取不到应用程序的状态的解决办法
Archive生成Release版本的ipa并将其提交到iTunesConnect,上传成功后我打开iTunesConnect网站登录我的开发账号,准备提交版本更新,然而我却找不到 ...
- 主成分分析PCA的前世今生
这篇博客会以攻略形式介绍PCA在前世今生. 其实,主成分分析知识一种分析算法,他的前生:应用场景:后世:输出结果的去向,在网上的博客都没有详细的提示.这里,我将从应用场景开始,介绍到得出PCA结果后, ...
- java 类反射记录
Class的getDeclaredMethod方法是获取当前类下的所有方法,包括private修饰的,该方法不获取父类的方法. getMethod获取父类及本类下的所有public方法.
- Zabbix日志监视的汇总报警(更新发送邮件脚本)
Zabbix的用户一定会碰到这种情况: 日志报警一般设置的是multiple模式,有错误大量写入的时候,每写入一行就会触发一次action,导致出现大量的报警邮件. 特别是ora的报警,经常一出就是上 ...
- iOS常用的忽略警告
在iOS开发过程中,偶尔会碰到一些编译器警告,如果能够确定该警告不会影响到程序的正常运行,则可以手动告诉编译器忽略掉这个警告 iOS常用的忽略警告类型: 1.方法弃用警告 #pragma clang ...
- 转:python获取linux系统及性能信息
原文:http://amitsaha.github.io/site/notes/articles/python_linux/article.html In this article, we will ...
- MVC 之 Partial View 用法
Partial View 顾名思义就是Html代码片段,因此可以用Partial View 把部分的Html或显示逻辑包装起来,方便多次使用. Partial View 需要放在Views ...
- 解决IE6下png图片透明度不显示的问题
世界上最遥远的距离,不外乎我在搞前端,你却在用旧IE,现在随着XP要退休了,IE6的市场占有率应该也会逐步下滑.不过基于天朝人民的惰性以及企鹅微软的“扎篱笆”活动,做网站的朋友依旧不能忽视IE6的存在 ...