Effective Java读书笔记(1)

Posted by alonealice on 2016-11-04

用静态工厂方法代替构造器

优势:
1.静态工厂方法有名字,可以增强阅读性,可以强化与其他静态工厂方法的区别。
2.静态工厂方法在返回对象时可以返回静态对象,不需要每次都创建新对象。
3.静态工厂方法可以返回原对象类型的子类型对象。
缺点:类如果没有公有的或者受保护的构造器,就不能被子类化。

遇到多个构造参数是用构建器

优势:
1.代码的可读性更高(看起来更高级)
2.可以有多个可变参数
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
FileDownloadThread fileDownloadThread =new FileDownloadThread.Builder(i)
.filePath(filePath)
.start(mFileSize*i)
.build();


public class FileDownloadThread {

private String filePath;

private int start;


public static class Builder{

private int start;

private String filePath;


public Builder(){}

public Builder start(int start){
this.start=start;
return this;
}

public Builder filePath(String filePath){
this.filePath=filePath;
return this;
}

public FileDownloadThread build(){
return new FileDownloadThread(this);
}


}

private FileDownloadThread(Builder builder){
if(builder!=null){

this.start=builder.start;

this.filePath=builder.filePath;

}
}
}

通过私有构造器强化不可实例化能力

某些不需要实例化的工具类,用户往往没有写显示的构造器,但是编译器会自动提供一个公有的、无参数的构造器。所以用户可以写一个显式的私有的构造器来强制使类不可实例化,但是这么做的缺点就是该类无法被子类化。

减少不必要的对象创建

1.尽量使用基本数据类型而不是装箱基本类型,比如long 对 Long
2.在类中会重用的部分尽量使用静态代码块

尽可能避免使用终结方法finalizer

1.finalizer方法可以释放对象资源,但是java中这个方法的执行时间是不定的,设置是否执行也是不定的,所以在finalizer中的程序不能保证是否被执行和执行的时间。
2.添加finalizer方法会极大的损耗性能。
3.对于一些使用完需要关闭的对象,可以使用显示方法关闭,比如InputStream。
finalizer的用处:
1.在显示终结方法未被调用的情况下做最后的终结操作。
2.终结一些不是很重要的资源。