责任链模式 定义 在职责链模式中,多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。 在 GoF 的定义中,一旦某个处理器能处理这个请求,就不会继续将请求传递给后续的处理器了。当然…
适配器模式 定义 适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。 一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。应用这种模式 算是“无奈之举”,如果在设计初期,我们就能协调规避接口…
解决的问题 有些数据在系统中只应该保存一份,比如系统的配置信息类 资源访问冲突的问题,比如多个logger写入同一个日志文件 几种实现方式 饿汉式 静态成员变量,类加载时实例化 线程安全 不支持延迟加载 public class HungryManDemo { private static final HungryManDemo instance …
前言 我们写的代码性能如何?用StopWatch来监控方法得出方法执行时间就是准确的? 使用JMH就可以回答第一个问题。JMH是方法级别的性能测试工具,并且是openjdk官方开发的(值得信赖),它有很多针对性能测试的功能,例如预热,该功能就可以解决StopWatch测试不准确的问题。 StopWatch测试不准确的原因如下: Java8引入的la…
类 类的组织 标准的Java约定,类结构定义如下: 公共静态变量 私有静态变量 私有实体变量 公共函数 私有函数 类应该短小 不应有太多全责。 单一权责原则 Single Responsiblility:类或模块应该有且只有一条加以修改的理由。 职责越清晰,被复用的可能性就越大。 内聚 类应该只有少数实体变量,方法操作的实体变量越多,内聚性越强。 …
错误处理 使用异常而非返回码 多个条件分支记录错误信息,可以封装进一个方法,在记录异常信息的地方抛出异常,并给出相应信息。在该方法外部捕获,记录异常信息。异常处理和正常业务流程隔离。 缩小异常类型,反例:全部使用Excception。 使用未检异常 代价:违反开闭原则。该方法调用链路上的方法签名都得修改。 给出异常发生的环境说明 应创建信息充分的错…
注释 什么也不会比陈旧,提供错误信息的注释更有破坏性。 若编程语言有足够的表达力,就根本不需要注释。 注释的恰当用法时弥补我们在用代码表达意图时遭遇的失败。 如果你发现自己需要写注释,就再想想看是否有方法翻盘。 个人认为注释还是要写,算是对代码的中文翻译,因为我们的英语水平,命名习惯各不相同。 注释掉的代码 其他人不敢删除注释掉的代码。他们会想,代…
冒泡排序 @Test public void test() { int[] arr = new int[]{3, 4, 1, 76, 3, 889, 8, 4}; for (int i = 0; i < arr.length - 1; i++) { for (int j = arr.length - 2; j >= i; j--) { …
序言:这是一本很多前辈推荐的书,阅读这本书后,我最大的感想就是:特别实在。书中时不时的出现一个句子,戳中你的内心。例如序言中的: 那堆“可以运行”的乱麻程序,就在我们的眼皮底下慢慢腐败。 对于软件而言,百分之八十或更多的工作量集中在我们美其名曰“维护”的事情上:其实就是修修补补。 习艺之要有二:知和行。你应当习得有关原则、模式和实践的知识,穷尽应知…
思路 刚开始我以为这题的考点是如何快速读取文件(因为这是公司多线程学习分享后布置的作业),我就用多线程来解题。后来出题人跟我说:200m测试数据时我的程序OOM了,我才醒悟这题的考点不是快速读取文件,而是大文件排序。 这题挺有意思的,解题运用了多路归并,有个巧妙的地方估计只有实操才知道——复用流。 题目 查找第K小/大数据 每个法官都有不同的办案能…