Effective Java 2 知识点总结(上)
关于对象
-
减少不比较的对象创建,考虑用static工厂方法减少对象的创建,类似常用的getInstace()
-
单例模式:static工厂方法比较极端的用法是单例模式自始至终只提供这个类的唯一实例。
-
不可避免的坑:static方法创建的对象的使用通常都需要考虑线程安全,能否防止反射调用私有构造方法,序列化机制,而进行防御式编程的相应操作,针对单例模式,在JDK1.5以后推荐枚举作为单例模式的首选,优点是代码简洁,线程安全,还可以防止被反射调用以及序列化避免重复创建实例。具体分析可以参考这篇文章:https://www.hollischuang.com/archives/197
-
构造函数需要多个可配置的参数,使用构建器:
` public class A { private String name; private String sex; private int age; private int height; private int weight; public static class Builder{ private String name; private String sex; private int age; private int height; private int weight; public Builder(String param1, String param2, ...){ this.name = param1; this.sex = param2; } public Builder setAge(int age){ this.age = age; return this; } public Builder setHeight(int h){ this.height = h; return this; } ... ... public A build() { return new A(this); } } //私有构造器 private A (Builder bulider) { name = builder.name; sex = builer.sex; ... ... ... } } 用法:A boy = new A.Builder("Jack", "famle").setAge(12).bulid();相比于JavaBean这样解析方式,代码简洁且线程安全。
-
尽量不要new一个String,与Hash表灯数据接口联用的数据模型,用过之后需要显示清空数据结构缓存内容
-
尽量不用finalizer,因为子类重写了父类的该方法会导致,子类不显示调用父类finalizer方法会使父类的finalizer方法得不到及时的调用,如果恰巧在finalizer处理了数据的回收操作,那这部分将会导致内存泄漏,解决方法,在父类中创建final匿名内部类重写finalizer该方法并调用父类的finalizer做数据的清理与回收。
关于通用方法(一般模仿String类即可)
- equals的重写遵循原则比较多,但基本上可以归结为类似的思路写法:判断对象地址-判断类型-转换类型比较Field的内容,改写equals必须同步重写hashcode的值,这样可以保证与Hash、set等数据结构连用时遵循这些原则以及行为同步。
- hashcode的计算:为对象里面的每个Feild计算hashcode,一般的这个公式就可以满足:31*hashcode + feild(查看类型转换表进行处理)
- toString 如果Object.toString不是你想看到的结果,那就重写但需要注意有feild删减注意同步更新该方法即可。
- Comparable接口区别于equals的作用,Comparable可以规定比较的顺序,自定义决定核心比较的内容,比equals要简单直接。
- 尽量不碰的clone