EffectiveJava笔记

1.考虑用静态工厂方法代替构造函数(Integer.valueOf(),Boolean.valueOf())
    1.静态方法有方法名进行分辨
    2.静态方法不一定非要新建一个对象,new 方法肯定会新建对象
    3.可以返回子类对象(?)
    1b.
    2b.与其他静态方法没有区别
2.私有构造函数强化单例
3.私有构造函数防止被实例化或子类实例化
4.避免创建重复对象:如String s=new String("Hello world");//不推荐
5.消除过期的引用对象:手动ref=null以释放资源,适用于数组
6.避免使用终结函数finalize(),java自动垃圾回收比人为回收资源稳定
/////对象
7.重写equals()时遵守标准
8.重写equals()时顺便把hashCode()也重重写了
9.建议重写toString()
10.谨慎重写clone():复杂度太高了,尽可能不重写而是提供其他拷贝方法
11.实现Compareable接口:值类都应该这样,方便排序什么的,compareTo()不用判断时参是否为null
///////类和接口
12.使类和成员的可访问能力最最小话:private default protected public
13.支持不可变性
14.复合优先于继承:与其实现父类的方法,不如将父类型作为子类的一个属性进行转发操作
    这样可以防止父类接口方法的变动影响子类,也叫“包装类”,不能用在回调框架上,
    最好不要支持链式编程
15.要么专门为继承而设计,并给出详细的文档说明,要么禁止继承:
    继承为了方便实现,可考虑钩子函数的使用
    子类构造函数不能调用可重载(override)的函数
    clone()和readObject也不能调用可重载的任何方法,他们跟构造函数差不多
    如果必须继承,确保没有自调用方法
16.接口由于抽象类:java单继承机制使抽象类不好用
    接口方便子类的功能扩展
    可以考虑一个接口骨架子类实现大部分相关操作如:AbstractXXX.class
17.接口仅限于定义类型:
    为了常量而实现一个接口不明智,反而是污染
18.优先考虑静态成员类:
    静态内部类占用更少的内存(内部类不访问外部类属性的情况下)
///////C语言替代
19.用类代替结构
///////方法
23.检查参数的有效性
24.必要时使用保护性拷贝
25.谨慎设计方法的原型:接口方法明具备一定的相似
    参数一般3个左右即可
    用类携带参数,以减少参数数量
    尽量使用接口作为参数,而不是实现类
26.谨慎重载方法:overload不是override(覆盖)
    避免参数数目相同的重载方法
27.返回零长度的数组而不是null
28.为所有导出的公开API写注释文档
//////////第7章:通用程序设计
29.将局部变量的作用域最小化
30.了解和使用库
31.如果要求高精度的答案,避免使用float和doubel:BigDecimal更精确
32.如果有其他类型适合,尽量避免String:
    值类型就用值类型
    字符串不适合代替枚举
33.了解字符串连接的性能:String是值不变类,值永远不变,StringBuilder,StringBuffer
34.通过接口引用对象:参考25,顶层父类代替子类作为引用对象
35.接口比反射优先:反射会丢失编译检查的好处,反射性能普遍较低
36.谨慎使用本地方法JNI:JVM(JDK1.3之后)发展到现在,性能已经可以匹敌本地其他语言方法了
37.谨慎优化:一句话,不要优化,尤其是不成熟的优化
    努力编写好的程序而不是快的程序
    努力避免那些限制性能的设计决定,API,数据格式等
    优化后记得测试性能
38.遵守普遍接受的命名规范
////////第8章:异常
39.只针对不正常的条件使用异常:随便使用异常只会牺牲性能
    状态测试如hasNext()比较好
    尽量不强迫API使用者使用异常
40.对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常
41.尽量不要抛出多余的异常:麻烦
    如果异常较少的话还不如不抛,可以考虑转换成boolean
42.尽量使用标准异常
43.抛出的异常要合适于相应的抽象
    异常捕获与转换
44.每个抛出的异常都要有文档
45.在细节中包含失败,捕获信息
46.努力使失败保持原子型
    尽量检查参数的有效性
    在拷贝上操作,完成再复制
47.不要忽略异常
///////////第9章:线程

//////////第10章:序列化
54.谨慎使用Serializable
    序列化开销很大
    为了继承而设计的类应尽量不要实现序列化接口:抽象类不能实例化等因素
55.尽可能自己设计序列化形势
    如果不确定是否需要使用默认的序列化形势,则不要使用默认序列化
    如果一个对象的物理表示等同于它的逻辑内容,可以考虑默认序列化形式
    默认序列化尽量提供readObject()实现约束
56.保护性的实现readObject()
57.必要时提供一个readResolve()

时间: 2024-10-10 20:59:58

EffectiveJava笔记的相关文章

EffectiveJava读书笔记——接口优于抽象类

9%E5%A5%97Android%E5%AE%9E%E6%88%98%E7%BB%8F%E5%85%B8%E9%A1%B9%E7%9B%AE%E8%B5%84%E6%96%99%E5%88%86%E4%BA%AB%E7%BB%99%E5%A4%A7%E5%AE%B6 ????cImbiUMM???]?????? http://auto.315che.com/weidalaisi/qa23802422-2.htm ??????jbGbY735????????? ????\c7SOSF7P??иб

EffectiveJava读书笔记——考虑用静态工厂方法代替构造器(一)

参考网址:http://blog.csdn.net/mingyunduoshou/article/details/6149758 http://blog.163.com/[email protected]/blog/static/10182372420133220511247/ 静态工厂方法讲解 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实

<EffectiveJava>读书笔记--01继承的使用注意

1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该子类中重写的方法; 因此子类还没有初始化, 所以可能会造成一些问题. 示例代码如下: 父类: public class Father1 { public Father1() { overRide1(); } public void overRide1(){ System.out.println("父

【安全牛学习笔记】

弱点扫描 ╋━━━━━━━━━━━━━━━━━━━━╋ ┃发现弱点                                ┃ ┃发现漏洞                                ┃ ┃  基于端口五福扫描结果版本信息(速度慢)┃ ┃  搜索已公开的漏洞数据库(数量大)      ┃ ┃  使用弱点扫描器实现漏洞管理            ┃ ╋━━━━━━━━━━━━━━━━━━━━╋ [email protected]:~# searchsploit Usage:

51CTO持续更新《通哥的运维笔记》

<通哥的运维笔记>将持续在51CTO网站更新,希望大家多多关注.互相学习,后期,我将会退出<通哥的运维笔记>系列视频教程,希望带给大家最大的收获,帮助大家更好的学习.进步.<通哥的运维笔记>主要从linux系统管理.虚拟化.cloudstack云平台以及网络管理之CCNA.CCNP.CCIE,等等方面深入讲解.

WPF笔记整理 - Bitmap和BitmapImage

项目中有图片处理的逻辑,因此要用到Bitmap.而WPF加载的一般都是BitmapImage.这里就需要将BitmapImage转成Bitmap 1. 图片的路径要用这样的,假设图片在project下的Images目录,文件名XXImage.png. pack://application:,,,/xxx;component/Images/XXImage.png 2. 代码: Bitmap bmp = null; var image = new BitmapImage(new Uri(this.X

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

学习笔记之邮件发送篇

用脚本语言发送邮件是系统管理员必备技能 对系统定期检查或者当服务器受到攻击时生成文档和报表. 发布这些文档最快速有效的方法就是发送邮件. python中email模块使得处理邮件变得比较简单 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 本段摘录于    http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 1.smtplib模块 smtplib.SMTP([host[, p