`
wdmcygah
  • 浏览: 60581 次
社区版块
存档分类
最新评论

三、编写高质量的代码—类、对象和方法(笔记)

    博客分类:
  • J2SE
阅读更多

 

本博文为《编写高质量代码—改善Java程序的151个建议》一书的阅读笔记。该书从很多方面给予了编写高质量代码的宝贵经验。而且该书应该是那种开发经验越丰富,体会越深的书籍。在阅读过程中,从该书中收获良多,这里主要作下书籍笔记,有体会的地方加点自己的想法。受限于知识水平,部分内容还没能深刻体会,所以更多更好的内容和具体实例还需要从书中去找寻。

一、静态方法不能覆写可以隐藏

在Java中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法(static修饰的方法,也叫类方法)。
如果在了类中构建与父类相同的方法名、输入参数、输出参数、访问权限(权限可以扩大)并且父类子类都是静态方法,此种行为叫做隐藏。与覆写有两点不同:
1. 表现形式不同:隐藏用于静态方法,覆写用于非静态方法。在代码的表现上是:@Override注解可以用于覆写,不能用于隐藏。
2. 职责不同:隐藏的目的是为了抛弃父类静态方法。
所以在静态方法调用时一定要注意避免使用实例对象访问静态方法或静态属性,而应该使用类进行访问。

二、构造函数尽量简化

书中举了一个非常好的例子,这里限于篇幅不搬上来了。总之构造函数如果过于复杂,可能导致由于类的构造顺序问题出现意想不到的结果。因此在类初始化时如果有什么复杂逻辑可以考虑抽出单独的init或start方法,尽量保证构造函数的简化。

三、避免在构造函数中初始化其它类

在构造函数中初始化其它类可能导致在复杂项目中出现类对象循环构造的情况,所以需要尽量避免。

四、使用构造代码块精炼程序

构造代码块是指在类中没有任何的前缀或后缀,并使用“{}”括起来的代码片段。例如

public class Child {
	{
		System.out.println("这是构造代码块");
	}

	public Child() {
		System.out.println("这是无参构造函数");
	}
}

 编译器会把构造代码块插入到每个构造函数的最前端,所以在生成对象时总是会先执行构造代码块,再执行构造函数的代码。(不过有一种情况例外,遇到this关键字时,即构造函数中调用其它构造函数时,此方法不会插入构造代码块)
构造代码块主要适用于如下场景:(1)初始化实例变量;(2)初始化实例环境。

五、覆写equals方法要注意

关于覆盖equals方法的中肯建议,《Effective Java》一书中给了非常好的建议。首先equals方法实现了等价关系,需要满足自反性、对称性、传递性、一致性。
编写高质量equals方法的诀窍为:
1. 使用==操作符检查“参数是否为这个对象的引用”,如果是,则返回true;
2. 使用instanceof操作符检查“参数是否为正确的类型”,如果不是,则返回false;
3. 把参数转化为正确的类型;
4. 对于该类中的每个“关键域”,检查参数中的域是否与该对象中对应的域相匹配;
5. 编写单元测试查看是否满足对称性、传递性、一致性;
6. 覆写equals方法总要覆盖hashCode方法;
7. 不要将equals声明中的Object对象声替换成其他的类型。
equals方法可以通过IDE(例如eclipse)自动进行生成,避免不必要的错误。

六、覆写equals方法必须覆盖hashCode方法

如果覆写了equals方法而没有覆写hashCode方法,则违背了Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运行。
关于HashCode的写法《Effective Java》中有详细的建议,在实际编写中可以使用IDE(例如eclipse)自动生成,或者使用Commons-lang包中的HashCodeBuilder类进行生成。

七、推荐覆写toString方法

由于JDK提供的默认toString方法并不友好,所以为了打印的内容便于理解,推荐覆写toString方法。

八、不要主动进行垃圾回收 

如果不是对于JVM非常了解,不要在代码中主动进行垃圾回收,这样可能导致极大的项目风险。

 

 

1
0
分享到:
评论

相关推荐

    深入理解javascript学习笔记(一) 编写高质量代码

    第二,JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性(不是真正意义上的全局变量,可以用delete删除) 代码如下: function sum(x,y) { // result 未声明,为隐式全局变量 result =...

    java笔记:02.windows常用快捷键.md

    java笔记:02.windows常用快捷键.md ...同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性

    java笔记:01.IDEA常用配置总结.md

    java笔记:01.IDEA常用配置总结.md ...同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编

    java笔记:03.jdk的卸载和安装.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    01.Vue学习笔记.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    java学习:01.JVM笔记.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    java学习:01.redis笔记.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    软件设计与体系结构期末复习笔记(xinhua)

    高质量代码的四个基本特性:(记忆) ① 正确性 ② 简单性 ③ 可读性 ④ 可测试性 软件设计模式(Software Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结...

    c语言课堂笔记.zip

    C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%-20%。因此,C语言可以编写系统软件。 当前阶段,在编程...

    软件工程-理论与实践(许家珆)习题答案

    C) 方法、对象和类  D) 过程、模型、方法 3. 包含风险分析的软件工程模型是(A)。 A) 螺旋模型 B) 瀑布模型 C) 增量模型 D) 喷泉模型 4. 软件工程的主要目标是(C)。 A) 软件需求 B) 软件设计 C) 风险分析...

    python免费课件-零基础python入门(含课件代码)PDF高清版.pdf

    - 判断第⼏天 第⼋章:案例6 -- 判断密码强弱 第九章:案例7 -- 模拟掷骰⼦ 第⼗章:案例8 -- 空⽓质量指数(AQI)计算及分析 学习笔记 Python基础教程之异常详解 ⼀、摘要 Python使⽤被称为异常 的特殊对象来管理程序...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    matlab如何敲代码-Advanced-Python:像专业人士一样编码!

    您想编写高质量的代码,以便您和您的同事将来可以维护它……这样您就可以早点回家并参加派对。 您想成为团队中最酷的程序员,晋升为高级首席Python Genius,并赚大钱! 您想学习描述符协议如何实现魔术方法调用,您...

    apprentice-boot-camp-fundamentals-1:滑梯

    TC1逻辑:至少以一种语言编写具有良好语法的高质量代码(逻辑) TC4测试:可以测试代码并分析结果,以纠正使用V模型手动测试和/或单元测试发现的错误 TC10可以根据相关范例(例如,面向对象,事件驱动或过程)应用...

    会计理论考试题

    4.硬盘格式化分三个阶段,其先后顺序为低级格式化、分区、高级格式化。( Y ) 5.西文工作方式下不可输入汉字。( Y ) 6.微机的键盘是一种分离式的智能键盘,通过电缆与显示器连接。( N ) 7.写保护口用于保护存储在...

Global site tag (gtag.js) - Google Analytics