Effective Java 学习笔记

本文档总结了《Effective Java》一书中的编程建议,涵盖了对象的创建与销毁、Object方法的覆写、类和接口的设计原则、方法的编写技巧、变量作用域的管理、异常处理、多线程编程注意事项及序列化的实现等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://onbus.blogbus.com/logs/10898226.html

Effective Java 学习笔记

一、创建和销毁对象 
1,考虑以static factory method取代构造函数       工厂(创建与使用分离) 
2,以private构造函数进行singleton      单态(需要定义一个private static实例变量) 
3,以private构造函数进行不可实例化      单态时要用,你不能new了吧,嘿嘿 
4,避免创建重复对象       这个年代,能复用就复用吧(String str = new String("as long as you love me!")) 
5,消除不用的object       reference XXX = null(静静等待GC回收吧!) 
6,避免使用finalize()       GC回收前调用,但何时会进行GC不定(你不会自己System.gc()吧!)  
 
二、Object的method 
1,覆写equals()时请遵守通用的契约      是判断reference还是content???(对比==) 
2,覆写equals()时总是一起覆写hashCode()      当用于HashMap(或Hashtable)的key时需要 
3,总是覆写toString()     友好方式显示信息(讨厌 XXX@XXX!) 
4,谨慎覆写clone()      注意深浅克隆 
5,考虑实现Comparable     无语  
 
三、类和接口 
1,将类的member的存取性最小化    变量为private 对外方法为public 帮助(内部)方法为private 
2,偏爱不变性     类的Field为private,且不提供public的set方法 
3,优先考虑组合然后才是继承     具体情况具体分析,但即使继承也最好用abstract class 
4,尽量以接口取代抽象类     面向接口编程嘛!(Struts里的基类Action改成接口不是更爽) 
5,接口只应当被用来定义类型      “类型”?可以说是一种抽象类型,实现此接口即具有了其特征 
6,优先考虑static member class,然后才是non-static      特别是new后不变的对象  
 
四、方法 
1,检查参数的有效性      前置条件(design by contract,不要想当然别人一定会给你正确的东东) 
2,必要时进行保护性拷贝       clone()(听到克隆(人)我就怕!相关电影看多了) 
3,注意重载        英文名overload,不是override(覆盖) 
4,宁愿返回长度为0的array,不要返回null        NPE,我心中永远的痛!!! 
5,为所有method提供文档注释         javadoc(我承认经常忘写,反省ing)  
 
五、一般原则 
1,将变量的作用域尽量最小化      用private(如对外,加public get/set方法),特殊用protected 
2,尽量用用标准库API        不要重复发明轮子好不好 
3,如果其他类型更适合,就不要使用字符串   怀疑:Web(HTTP)中传来传去都是字符串(省去类型转换,呵呵) 
4,注意字符串连接的效率      没错,用StringBuffer(调用append()、toString()) 
5,通过接口使用对象         接口与实现分离(地球人都知道,你不会不晓得吧!非常十分特别很重要) 
6,优先使用接口,然后才考虑反射(reflection)       牛人稀饭用反射! 
7,遵守普遍的命名习惯       小朋友,请遵守游戏的一般规则(用描述性的名称)  
 
六、异常 
1,只在异常情况下才使用异常机制         偶却经常用于流程控制,悲哀!!! 
2,对可恢复状态使用检查异常(Exception),对编程错误使用运行期异常(RuntimeException) 
3,不要滥用检查异常          用好throws,不要搞得到处是try/catch(check VS uncheck) 
4,尽量使用标准异常          不够时自己extends Exception(RuntimeException),最好定义自己的基类异常 
5,抛出与其抽象性相应的异常       异常分层、分类,不要太细 
6,对每一个方法所抛出的每一个异常说明       check exception需要,uncheck不需要 
7,以详细的信息记录失败情况下的异常         考虑chain exception,异常日志记录(17173) 
8,不要忽视异常    try/catch后不作处理(捕获但不(或随便)处理),做事要负责啊!!!  
 
七、多线程 
1,同步存取共享之可变数据     synchronized(本质是在对象实例或Class对象上加了锁) 
2,避免过度使用同步机制     同步意味着什么?性能下降 
3,注意多线程安全       thead-safe?怕怕,让容器处理 
4,不要倚赖执行时的线程调试器     因为是抢占式调用(机会均等,基本上是先来先“服务”,VIP除外)  
 
八、序列化 
1,谨慎实现Serializable      JavaBean、RMI需要(状态暂存、通过网络传输时都要) 
2,考虑使用自定义的序列化方式      覆写writeObject() readObject()  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值