Skip to content

Commit c1a27b8

Browse files
committed
docs: add effective-java.md
1 parent d12aed1 commit c1a27b8

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

docs/effective-java.md

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# 《Effective Java》
2+
3+
## 第二章 创建和销毁对象
4+
5+
### 第 1 条:考虑用静态工厂方法代替构造器
6+
静态工厂方法相比构造器,优势有以下几个:
7+
8+
1. 静态工厂方法有名称,能更确切地描述正被返回的对象,更易于阅读。构造器方法名称都是固定的,只能通过改变参数列表来构造不同对象。
9+
1. 不必在每次调用时都创建一个对象,可以先将对象缓存起来,需要时直接返回,避免创建不必要的重复对象。比较时可以直接用 `==` 操作符。
10+
1. 可以返回原返回类型的任何子类对象,更加灵活。适用于基于接口的框架。
11+
1. 在创建参数化实例时,代码更加简洁。
12+
13+
不需要接连两次提供类型参数:
14+
15+
```java
16+
Map<String, List<String>> m = new HashMap<String, List<String>>();
17+
```
18+
19+
只需要提供一个静态工厂方法:
20+
21+
```java
22+
public static <K, V> Hash<K, V> newInstance() {
23+
return new HashMap<K, V>;
24+
}
25+
26+
Map<String, List<String>> m = HashMap.newInstance();
27+
```
28+
29+
但是,静态工厂方法也有一些缺点:
30+
31+
1. 类如果只包含私有构造器,那么就不能被子例化(继承)。但这样也许也会因祸得福,因为它鼓励使用复合,而不是继承;
32+
1. 静态工厂方法与其它静态方法没什么区别,无法像构造器一样在 API 文档中明确标识出来。但是,静态工厂方法有一些惯用名称,如 `valueOf`, `of`, `getInstance`, `newInstance`......
33+

0 commit comments

Comments
 (0)