哲学上说变与不变,讲的是绝对运动与相对静止的道理,在代码设计中,也有许多变和不变之间的辩证故事。

有一些类在创建以后,整个生命周期内都不会发生变化,这种模式被称为Immutable Pattern。

较弱的不变模式:指的是一个类的实例状态是不可变化的,但是这个类的引用的实例却可以变化。

比如说:Visitor模式常常是这样的,整个流程是不可变的,但是我为我的整个流程提供灵活的切入点,提供出来访问接口,供变化的部分完成。

较强的不变模式:一个类实例状态不可变,其内部引用的所有实例也不可变。

这个就比较多了,JDK中的String、Integer、Byte等都是不可变的。

变化的场景需要考虑许多事情,因为变化带来了“状态”的概念。但正因为有了状态,整个世界才丰富多彩。变化需要考虑共享访问的情形,需要考虑状态之间的关系。当我们享受到代码变化带来的愉悦,也开始追求不变的代码,那一份古朴和单纯。

不变,引伸出对象复用的好处来。无状态的单例,很多场景下可以看作简单的工具类;更多的对象在一定时期内无状态,比如Prototype模式,比如线程池、缓存,这些都将哲学中的变与不变最终结合到代码中去。不变,是快速的、简单的、敏捷的,将变化的状态连结起来了。

程序=算法+数据,算法是不变的,数据是可变的。仿佛从软件的一开始,变与不变就给后续的万事万物埋下了伏笔,代码的世界围着这个特殊的视角旋转。随着动态语言的兴盛,以往不可变的方法也可以被改变,方法本身也能变成对象,数据和算法轻而易举地在代码中变幻,我们越来越疑惑,还有什么不变的东西,可以让我们彻底看清和相信一次?

Action是具备状态的,线程独立的;Service和DAO是无状态的,是可以被池化的。不变得再极致一点,我希望从编译之后它就是不变的,而不是对象创建之后不变,这就是方法。静态语言中的方法逻辑本身就是不可变的;而另一方面,当方法内部所使用的一切变量,都严格被控制在方法内部的临时变量或者按值传递的参数中,这说的,不正是函数式编程吗?

也许,其实软件的本质很简单,我一直在思考,软件复杂化的本质就是为了追求简单的东西。就像这个变化莫测的世界,不变的故事,总是那么淅淅沥沥的,却又惊人地相似。

本文的最后,Rod Johnson说:

If possible, design applications to use a stateless service layer. Hold state in the web tier, rather than in the business logic tier, if possible.

java integer 不变模式_Java代码的变与不变相关推荐

  1. java语音验证码_Java代码示例_Java语音验证接口 | 微米-中国领先的短信彩信接口平台服务商...

    Java语音验证接口代码示例 请求 import java.util.HashMap; import java.util.Map; public class IvrDemo { /** * 语音验证接 ...

  2. java integer 相等_Java Integer.equals()判断相等

    首页 > 基础教程 > 常用类 > 常用 Integer类 Java Integer.equals()判断相等 Java中判断Integer是否相等可以用equals()或者&quo ...

  3. java输出日志_java代码中如何正确使用loggger日志输出

    java代码中如何正确使用loggger日志输出 发布时间:2019-06-28作者:spider阅读(2980) 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统, ...

  4. java 执行顺序_Java代码执行顺序

    程序中代码执行的顺序非常重要,稍有不慎便会是程序运行出错,那么我将结合实例来分析代码中的执行. 名词解释 首先了解几个名词: 非静态代码块 直接由 { } 包起来的代码,称为非静态代码块 静态代码块 ...

  5. java strim性能_Java代码性能优化总结

    前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...

  6. java 绘制六边形_JAVA代码怎么实现图像六边形网格分割效果

    下面给大家介绍JAVA代码怎么实现图像六边形网格分割效果,希望能给大家提供帮助. 一:原理 根据输入参数blockSize的大小,将图像分块,决定每块的中心通过该像素块内所有像素之和的均值与该块内部每 ...

  7. java 读取 指纹_java代码怎么获取数字的证书那一串20位指纹?

    展开全部 通过JAVA来读取数字证书的方法获取20位指纹: CARead.java文件代码32313133353236313431303231363533e4b893e5b19e31333339663 ...

  8. java integer 相加_JAVA Integer类型自加

    JAVA语言中有一些基本数据类型,比如int,long,double... 这些数据类型可以支持一些运算操作符,其中对于int类型的++/--操作符 Integer类型是一个对象类型,居然也可以支持+ ...

  9. java integer 不变模式_多线程编程的设计模式 不变模式(zt)

    因为字符串类是不变模式最典型的代表,所以其它的知识将在下面继续介绍. 多线程编程的设计模式 不变模式(二) 不变模式(Immutable Pattern)顾名思义,它的状态在它的生命周期内是永恒的(晕 ...

最新文章

  1. 百练4103:踩方格
  2. CentOS6.3的Grub启动项的menu.lst文件内容
  3. .net中自定义过滤器对Response内容进行处理
  4. POJ-1840 Eqs Hash表
  5. leetcode738. 单调递增的数字(贪心)
  6. 微软MVC对架构的一点思考
  7. 余弦定理的应用:基于文字的文本相似度计算
  8. 【转】工作站和服务器的区别
  9. 该网站可能含有恶意软件,有可能会危害您的电脑 清除办法
  10. Cuiwei Li / Detection of ECG characteristic points using wavelet transforms
  11. Spring Cloud Hystrix - 服务容错
  12. Html - Json转excel文件
  13. U盘写保护、不可访问、无法格式化问题的解决办法
  14. /etc/shadow可以破解吗?
  15. ADS2015导入飞思卡尔元器件模型 安装DesignKit
  16. 鸿蒙ios,鸿蒙2.0和ios区别_鸿蒙2.0和ios有什么差别
  17. 【论文阅读】 Reinforced Video Captioning with Entailment Rewards
  18. 云管平台监控实践分享
  19. HTML页面刷新方法
  20. 恒定帧率30帧以上录制掉帧问题分析

热门文章

  1. 关于AUC计算公式推导
  2. 66. Plus One
  3. count followers
  4. pycharm控制台调试程序
  5. 论文辅助笔记(代码实现):Bayesian Probabilistic Matrix Factorizationusing Markov Chain Monte Carlo
  6. scipy笔记:wishart (威沙特分布)
  7. 算法岗一片红海,如何选择适合自己的方向?
  8. Hadoop学习之HDFS架构(一)
  9. Python实战系列之调用小黄鸡simsimi
  10. Python入门100题 | 第028题