2.重新研读Java语言
2.1 说明
本章介绍的Java语言特性主要包括:
- Package包
- Generics泛型
- Annotation标注
- Enum枚举
它们对于提高代码扩展性、灵活性很有帮助。
2.2 Java部分语法内容扩展
2.2.1 规划和组织代码——包
好的包结构规划使工程化代码与非工程化代码最直观的一个区别。《Java语言编码规范》。
包使用域名反写的小写字母,各选项介绍如下:
- app代表项目或产品
- framework:代表组织级的通用开发框架。
- util:公司自主开发的各种工具
- tutorial:完全面向培训用途,示例程序。
2.2.2 正式命名的常量契约——枚举
当选择是否使用枚举时,建议套用如下规则判断:一系列常量具有明确的业务、技术含义,且预期在系统生命周期内不会变化。
2.2.3 考验算法的抽象能力——泛型
1.抽象及抽象能力支持
Java为我们提供的抽象能力:
- Class:提供了对现实世界的抽象能力
- Interface:提供了对Class行为的抽象
- Annotation:对类型元数据的抽象
- Generics:给上述因素进N步的抽象。
2.应用于模式
项目中,随着模式的实现方式和使用方法逐步固定,可以用泛型对算法的数据结构进行抽象,进而提高算法的的实用性。
3.容器
泛型的另一个主要用途是建立各种强类型的容器,也就是集合类型,类型参数用于定义容器中具体元素的类型。
相对于一般的泛型类型而言,泛型对集合类型的意义更重要,因为:接口和参数更明确,而且不仅仅停留在UML的图纸上,在编码和调用过程中都起到刚性的检查作用。
4.类型参数约束
类型参数的约束作用除了体现在控制实例化过程外,还有如下注意事项:
- 当类成员使用类型参数时,该类型参数的约束也同样适用于相关成员。
- 设计每一个类型的时候,要根据客户程序的需求,反复斟酌类型参数约束。
- 对于集合类型,尽可能不要在生产代码中出现无约束的参数类型。
5.小结
如果代码被反复重用,只要进度允许,建议尽量使用泛型,因为:
- 省去开发人员猜来猜去,可以提高开发效率。
- 抽象给代码带来更多的适应性。
- 减少接口和参数的歧义。
- 锻炼开发者的抽象能力。
2.2.4 用贴标签的方式扩展对象特性——标注
实际工程中,标注常常会和反射、配置一同使用。对于设计模式,标注同样可以从很多方面对类型进行扩展,减少客户端程序使用的复杂度。例如:
- 把状态模式中的状态类型声明为标注
- 把各类代理类型需要的控制特征通过标注体现出来。
2.3 面向插件架构的配置系统设计
工程化代码和玩具代码另一个最大的区别就是有关配置的处理。
本书配置文件主要用来登记需要动态加载的类型,采用jdk的XML类解析.xml配置文件。布局上,采用如下方式:
- 每个模式定义一个配置节
- 配置节定义一个OCM的基类ConfigSeciton,而各模式具体的OCM类均在继承ConfigSection的基础上进一步扩展,类名与模式名一致。
- 所有配置节有列入一个名为<practicalpatterns>的配置文件组,它表示本系列各册配置内容的根节点。
- 在<practicalpatterns>配置节组下增设一个名为<configSections>的配置节,专门定义为每个模式所使用的OCM类型。
2.4 依赖注入
采用依赖注入的方式将加工好的抽象类型示例“注入”到客户程序中。
2.4.1 构造注入
这种注入方式是在构造函数的执行过程中,将抽象类型作为参数传递给客户类型。
2.4.2 设置注入
相对于构造注入方式而言,设值注入给了客户类型后续修改的机会,比较适用于客户类型实例存活时间较长的场景。
2.4.3 接口注入
接口注入是将抽象类型的入口以方法定义在一个接口中,如果客户类型需要获得这个方法,就需要以实现这个接口的方式完成注入。
2.5 连贯接口(Fluent Interface)
连贯接口方法的的要点:
- 每个连贯方法的返回值都是一个类型实例,但不一定是其本身。