# Effective Javaä¸ä¹¦ç¬è®°
## 对象çå建ä¸éæ¯
+ Item 1: 使ç¨static工忹æ³ï¼è䏿¯æé 彿°å建对象ï¼ä»
ä»
æ¯åå»ºå¯¹è±¡çæ¹æ³ï¼å¹¶éFactory Pattern
+ ä¼ç¹
+ å½åãæ¥å£çè§£æ´é«æï¼éè¿å·¥åæ¹æ³ç彿°åï¼è䏿¯åæ°å表æ¥è¡¨è¾¾å
¶è¯ä¹
+ Instance controlï¼å¹¶éæ¯æ¬¡è°ç¨é½ä¼å建æ°å¯¹è±¡ï¼å¯ä»¥ä½¿ç¨é¢å
å建好çå¯¹è±¡ï¼æè
å对象ç¼åï¼ä¾¿äºå®ç°åä¾ï¼æä¸å¯å®ä¾åçç±»ï¼å¯¹äºimmutableç对象æ¥è¯´ï¼ä½¿å¾ç¨`==`å¤ç符åè¯ä¹ï¼ä¸æ´é«æï¼
+ 工忹æ³è½å¤è¿åä»»ä½è¿åç±»åçå类对象ï¼çè³æ¯ç§æå®ç°ï¼ä½¿å¾å¼å模åä¹é´éè¿æ¥å£è¦åï¼éä½è¦å度ï¼èæ¥å£çå®ç°ä¹å°æ´å çµæ´»ï¼æ¥å£ä¸è½æstaticæ¹æ³ï¼é叏忳æ¯ä¸ºå
¶åå建ä¸ä¸ªå·¥åæ¹æ³ç±»ï¼å¦Collectionä¸Collectionsï¼
+ Read More: Service Provider Framework
+ 缺ç¹
+ ä»
æstatic工忹æ³ï¼æ²¡æpublic/protectedæé 彿°çç±»å°æ æ³è¢«ç»§æ¿ï¼è§ä»è§æºï¼è¿ä¸æ¹é¢ä¹è¿«ä½¿å¼åè
å¾åäºç»åèéç»§æ¿ï¼
+ Javadocä¸ä¸è½åå
¶ä»staticæ¹æ³åºåå¼ï¼æ²¡ææé 彿°çé䏿¾ç¤ºä¼ç¹ï¼ä½å¯ä»¥éè¿å
¬çº¦çå½åè§åæ¥æ¹åï¼
+ å°ç»
static工忹æ³åpublicæé 彿°åæå
¶ä¼ç¼ºç¹ï¼å¨ç¼ç è¿ç¨ä¸ï¼å¯ä»¥å
èèä¸ä¸å·¥åæ¹æ³æ¯å¦åéï¼åè¿è¡éæ©ã
+ Item 2: 使ç¨å½æé 彿°çåæ°è¾å¤ï¼å°¤å
¶æ¯å
¶ä¸è¿æé¨åæ¯å¯éåæ°æ¶ï¼ä½¿ç¨Builder模å¼
+ 以å¾çæ¹æ³
+ Telescoping constructorï¼é对å¯éåæ°ï¼ä»0ä¸ªå°æå¤ä¸ªï¼ä¾æ¬¡ç¼åä¸ä¸ªæé 彿°ï¼å®ä»¬æç
§åæ°æ°éç±å°å°å¤éå±è°ç¨ï¼æç»è°ç¨å°å®æ´åæ°çæé 彿°ï¼ä»£ç åä½ï¼ææ¶è¿å¾ä¼ éæ æä¹åæ°ï¼èä¸å®¹æå¯¼è´ä½¿ç¨è¿ç¨ä¸åºéè½çbugï¼
+ JavaBeans Patternï¼çµæ´»ï¼ä½æ¯ç¼ºä¹å®å
¨æ§ï¼æç¶æä¸ä¸è´é®é¢ï¼çº¿ç¨å®å
¨é®é¢ï¼
+ Builder Pattern
+ 代ç çµæ´»ç®æ´ï¼å
·å¤å®å
¨æ§ï¼
+ immutable
+ åæ°æ£æ¥ï¼æå¥½æ¾å¨è¦buildç对象çæé 彿°ä¸ï¼èébuilderçæå»ºè¿ç¨ä¸
+ æ¯æå¤ä¸ªfield以varargsçæ¹å¼è®¾ç½®ï¼æ¯ä¸ªå½æ°åªè½æä¸ä¸ªvarargsï¼
+ ä¸ä¸ªbuilderå¯ä»¥buildå¤ä¸ªå¯¹è±¡
+ Builderç»åæ³åï¼å®ç°Abstract Factory Pattern
+ ä¼ ç»çæ½è±¡å·¥å模å¼ï¼æ¯ç¨Classç±»å®ç°çï¼ç¶èå
¶æç¼ºç¹ï¼newInstanceè°ç¨æ»æ¯å»è°ç¨æ åæ°æé 彿°ï¼ä¸è½ä¿è¯åå¨ï¼newInstanceæ¹æ³ä¼æåºæææ åæ°æé 彿°ä¸çå¼å¸¸ï¼èä¸ä¸ä¼è¢«ç¼è¯æçå¼å¸¸æ£æ¥æºå¶è¦çï¼å¯è½ä¼å¯¼è´è¿è¡æ¶å¼å¸¸ï¼èéç¼è¯æé误ï¼
+ å°ç»
Builder模å¼å¨ç®åå°ç±»ï¼åæ°è¾å°ï¼ä¾å¦4个以ä¸ï¼ä¸ï¼ä¼å¿å¹¶ä¸ææ¾ï¼ä½æ¯éè¦äºä»¥èèï¼å°¤å
¶æ¯å½åæ°å¯è½ä¼å夿¶ï¼æå¯éåæ°æ¶æ´æ¯å¦æ¤ã
+ Item 3: å便¨¡å¼ï¼
ä¸ç®¡ä»¥åªç§å½¢å¼å®ç°å便¨¡å¼ï¼å®ä»¬çæ ¸å¿åç齿¯å°æé 彿°ç§æåï¼å¹¶ä¸éè¿éææ¹æ³è·åä¸ä¸ªå¯ä¸çå®ä¾ï¼å¨è¿ä¸ªè·åçè¿ç¨ä¸ä½ å¿
é¡»ä¿è¯çº¿ç¨å®å
¨ãååºåå导è´éæ°çæå®ä¾å¯¹è±¡çé®é¢ï¼è¯¥æ¨¡å¼ç®åï¼ä½ä½¿ç¨çè¾é«ã
+ double-check-locking
```java
private static volatile RestAdapter sRestAdapter = null;
public static RestAdapter provideRestAdapter() {
if (sRestAdapter == null) {
synchronized (RestProvider.class) {
if (sRestAdapter == null) {
sRestAdapter = new RestAdapter();
}
}
}
return sRestAdapter;
}
```
DCLå¯è½ä¼å¤±æï¼å 为æä»¤éæå¯è½å¯¼è´åæ¥è§£é¤åï¼å¯¹è±¡åå§åä¸å®å
¨å°±è¢«å
¶ä»çº¿ç¨è·åï¼ä½¿ç¨volatileå
³é®åä¿®é¥°å¯¹è±¡ï¼æè
使ç¨static SingletonHolderæ¥é¿å
该é®é¢ï¼åè
JLSæ¨èï¼ï¼
+ classçstatic代ç ï¼ä¸ä¸ªç±»åªæå¨è¢«ä½¿ç¨æ¶æä¼åå§åï¼èç±»åå§åè¿ç¨æ¯éå¹¶è¡çï¼è¿äºé½ç±JLSè½ä¿è¯
+ ç¨enumå®ç°åä¾
+ è¿åå¨åå°å®å
¨æ§é®é¢ï¼å©ç¨åå°ï¼å¯ä»¥è®¿é®ç§ææ¹æ³ï¼å¯éè¿å ä¸ä¸ªæ§å¶åéï¼è¯¥åéå¨getInstance彿°ä¸è®¾ç½®ï¼å¦æä¸æ¯ä»getInstanceè°ç¨æé 彿°ï¼åæåºå¼å¸¸ï¼
+ Item 4: å°æé 彿°ç§æåï¼ä½¿å¾ä¸è½ä»ç±»å¤å建å®ä¾ï¼åæ¶ä¹è½ç¦æ¢ç±»è¢«ç»§æ¿
utilç±»å¯è½ä¸å¸æè¢«å®ä¾åï¼æå
¶éæ±
+ Item 5: é¿å
å建ä¸å¿
è¦ç对象
+ æé«æ§è½ï¼å建对象éè¦æ¶é´ã空é´ï¼âéé级â对象尤çï¼immutableç对象ä¹åºè¯¥é¿å
éå¤å建ï¼ä¾å¦Stringï¼
+ é¿å
auto-boxing
+ 使¯å æ¤èæ
æä¸å建å¿
è¦ç对象æ¯é误çï¼ä½¿ç¨object poolé叏乿¯æ²¡å¿
è¦ç
+ lazy initializeä¹ä¸æ¯ç¹å«å¿
è¦ï¼é¤é使ç¨åºæ¯å¾å°ä¸å¾éé级
+ Map#keySetæ¹æ³ï¼æ¯æ¬¡è°ç¨è¿åçæ¯åä¸ä¸ªSet对象ï¼å¦æä¿®æ¹äºè¿åçsetï¼å
¶ä»ä½¿ç¨ç代ç å¯è½ä¼äº§çbug
+ éè¦defensive copyingçæ¶åï¼å¦ææ²¡æå建ä¸ä¸ªæ°å¯¹è±¡ï¼å°å¯¼è´å¾éèçBug
+ Item 6: ä¸å使ç¨ç对象ä¸å®è¦è§£é¤å¼ç¨ï¼é¿å
memory leak
+ ä¾å¦ï¼ç¨æ°ç»å®ç°ä¸ä¸ªæ ï¼popçæ¶åï¼å¦æä»
ä»
æ¯ç§»å¨ä¸æ ï¼æ²¡ææpopåºæ çæ°ç»ä½ç½®å¼ç¨è§£é¤ï¼å°åçå
åæ³æ¼
+ ç¨åºåçé误ä¹åï¼åºè¯¥å°½å¿«æé误æåºï¼è䏿¯ä»¥é误çç¶æç»§ç»è¿è¡ï¼å¦åå¯è½å¯¼è´æ´å¤§çé®é¢
+ éè¿æåéï¼å¼ç¨ï¼ç½®ä¸ºnull䏿¯æå¥½çå®ç°æ¹å¼ï¼åªæå¨æç«¯æ
åµä¸æéè¦è¿æ ·ï¼å¥½çåæ³æ¯éè¿ä½ç¨åæ¥ä½¿å¾åéçå¼ç¨è¿æï¼æä»¥å°½é缩å°åéçä½ç¨åæ¯å¾å¥½çå®è·µï¼æ³¨æï¼å¨Dalvikèææºä¸ï¼åå¨ä¸ä¸ªç»å¾®çbugï¼å¯è½ä¼å¯¼è´å
åæ³æ¼ï¼[详è§](MemoryLeak.md)
+ å½ä¸ä¸ªç±»ç®¡çäºä¸åå
åï¼ç¨äºä¿åå
¶ä»å¯¹è±¡ï¼æ°æ®ï¼æ¶ï¼ä¾å¦ç¨æ°ç»å®ç°çæ ï¼åºå±éè¿ä¸ä¸ªæ°ç»æ¥ç®¡çæ°æ®ï¼ä½æ¯æ°ç»ç大å°ä¸çäºæææ°æ®ç大å°ï¼GCå¨å´å¹¶ä¸ç¥éè¿ä»¶äºï¼æä»¥è¿æ¶åï¼éè¦å¯¹å
¶ç®¡ççæ°æ®å¯¹è±¡è¿è¡nullè§£å¼ç¨
+ å½ä¸ä¸ªç±»ç®¡çäºä¸åå
åï¼ç¨äºä¿åå
¶ä»å¯¹è±¡ï¼æ°æ®ï¼æ¶ï¼ç¨åºååºè¯¥ä¿æé«åº¦è¦æï¼é¿å
åºç°å
åæ³æ¼ï¼ä¸æ¦æ°æ®æ æä¹åï¼éè¦ç«å³è§£é¤å¼ç¨
+ å®ç°ç¼åçæ¶åä¹å¾å®¹æå¯¼è´å
åæ³æ¼ï¼æ¾è¿ç¼åç对象ä¸å®è¦ææ¢åºæºå¶ï¼æè
éè¿å¼±å¼ç¨æ¥è¿è¡å¼ç¨
+ listneråcallback乿å¯è½å¯¼è´å
åæ³æ¼ï¼æå¥½ä½¿ç¨å¼±å¼ç¨æ¥è¿è¡å¼ç¨ï¼ä½¿å¾å
¶å¯ä»¥è¢«GC
+ Item 7: ä¸è¦ä½¿ç¨finalizeæ¹æ³
+ finalizeæ¹æ³ä¸åäºC++çææå½æ°ï¼ä¸æ¯ç¨æ¥éæ¾èµæºç好尿¹
+ finalizeæ¹æ³æ§è¡å¹¶ä¸åæ¶ï¼å
¶æ§è¡çº¿ç¨ä¼å
级å¾ä½ï¼èå½å¯¹è±¡unreachableä¹åï¼éè¦æ§è¡finalizeæ¹æ³ä¹åæè½éæ¾ï¼æä»¥ä¼å¯¼è´å¯¹è±¡çå卿åé¿ï¼çè³æ ¹æ¬ä¸ä¼éæ¾
+ finalizeæ¹æ³çæ§è¡å¹¶ä¸ä¿è¯æ§è¡æå/宿
+ 使ç¨finalizeæ¶ï¼æ§è½ä¼ä¸¥éä¸é
+ finalizeåå¨çæä¹
+ å
å½âsafety netâçè§è²ï¼é¿å
对象ç使ç¨è
å¿è®°è°ç¨æ¾å¼terminationæ¹æ³ï¼å°½ç®¡finalizeæ¹æ³çæ§è¡æ¶é´æ²¡æä¿è¯ï¼ä½æ¯æéæ¾èµæºå¥½è¿ä¸éæ¾èµæºï¼æ¤å¤è¾åºlogè¦åæå©äºææ¥bug
+ ç¨äºéæ¾native peerï¼ä½æ¯å½native peerææå¿
é¡»è¦éæ¾çèµæºæ¶ï¼åºè¯¥å®ä¹æ¾å¼terminationæ¹æ³
+ åç±»finalizeæ¹æ³å¹¶ä¸ä¼èªå¨è°ç¨ç¶ç±»finalizeæ¹æ³ï¼åæé 彿°ä¸åï¼ï¼ä¸ºäºé¿å
åç±»ä¸æå¨è°ç¨ç¶ç±»çfinalizeæ¹æ³å¯¼è´ç¶ç±»çèµæºæªè¢«éæ¾ï¼å½éè¦ä½¿ç¨finalizeæ¶ï¼ä½¿ç¨finalizer guardianæ¯è¾å¥½ï¼
+ å®ä¹ä¸ä¸ªç§æçå¿åObjectå类对象ï¼éåå
¶finalizeæ¹æ³ï¼å¨å
¶ä¸è¿è¡ç¶ç±»è¦åçå·¥ä½
+ å 为å½ç¶ç±»å¯¹è±¡è¢«åæ¶æ¶ï¼finalizer guardianä¹ä¼è¢«åæ¶ï¼å®çfinalizeæ¹æ³å°±ä¸å®ä¼è¢«è§¦å
## Objectçæ¹æ³
尽管Object䏿¯æ½è±¡ç±»ï¼ä½æ¯å
¶å®ä¹çéfinalæ¹æ³è®¾è®¡çæ¶å齿¯å¸æè¢«éåçï¼finalizeé¤å¤ã
+ Item 8: å½éåequalsæ¹æ³æ¶ï¼éµå¾ªå
¶è¯ä¹
+ è½ä¸éåequalsæ¶å°±ä¸è¦éå
+ å½å¯¹è±¡è¡¨è¾¾ç䏿¯å¼ï¼èæ¯å¯åçç¶ææ¶
+ 对象ä¸éè¦ä½¿ç¨å¤çæ¶
+ ç¶ç±»å·²éåï¼ä¸æ»¡è¶³åç±»è¯ä¹
+ å½éè¦å¤çï¼ä¸ç»§æ¿å®ç°æ æ³æ»¡è¶³è¯ä¹æ¶ï¼éè¦éåï¼é常æ¯âvalue classâï¼æimmutable对象ï¼
+ å½ç¨ä½mapçkeyæ¶
+ éåequalsæ¶éè¦éµå¾ªçè¯ä¹
+ Reflexiveï¼èªåæ§ï¼: x.equals(x)å¿
é¡»è¿åtrueï¼xä¸ä¸ºnullï¼
+ Symmetricï¼å¯¹ç§°æ§ï¼: x.equals(y) == y.equals(x)
+ Transitiveï¼ä¼ éæ§ï¼: x.equals(y) && y.equals(z) ==> x.equals(z)
+ Consistentï¼ä¸è´æ§ï¼: å½å¯¹è±¡æªåçæ¹åæ¶ï¼å¤æ¬¡è°ç¨åºè¯¥è¿ååä¸ç»æ
+ x.equals(null)å¿
é¡»è¿åfalse
+ å®ç°å»ºè®®
+ å
ç¨==æ£æ¥æ¯å¦å¼ç¨åä¸å¯¹è±¡ï¼æé«æ§è½
+ ç¨instanceofåæ£æ¥æ¯å¦åä¸ç±»å
+ å强å¶è½¬æ¢ä¸ºæ£ç¡®çç±»å
+ å对å个åè¿è¡equalsæ£æ¥ï¼éµå¾ªåæ ·çè§å
+ 确认å
¶è¯ä¹æ£ç¡®ï¼ç¼åæµä¾
+ éåequalsæ¶ï¼åæ¶ä¹éåhashCode
+ ï¼éåequalsæ¹æ³ï¼ä¼ å
¥çåæ°æ¯Object
+ Item 9: éåequalsæ¶ä¹éåhashCode彿°
+ é¿å
å¨åºäºhashçéåä¸ä½¿ç¨æ¶åºé
+ è¯ä¹
+ ä¸è´æ§
+ å½ä¸¤ä¸ªå¯¹è±¡equalsè¿åtrueæ¶ï¼hashCodeæ¹æ³çè¿åå¼ä¹è¦ç¸å
+ hashCodeçè®¡ç®æ¹å¼
+ è¦æ±ï¼equalsç两个对象hashCode䏿 ·ï¼ä½æ¯ä¸equalsç对象hashCodeä¸ä¸æ ·
+ åä¸ä¸ªç´ æ°ï¼ä¾å¦17ï¼result = 17
+ 对æ¯ä¸ä¸ªå
³å¿çfieldï¼å¨equalsä¸åä¸å¤æçfieldï¼ï¼è®°ä¸ºfï¼å°å
¶è½¬æ¢ä¸ºä¸ä¸ªintï¼è®°ä¸ºc
+ boolean: f ? 1 : 0
+ byte/char/short/int: (int) f
+ long: (int) (f ^ (f >> 32))
+ float: Float.floatToIntBits(f)
+ double: Double.doubleToLongBits(f)ï¼åæç
§longå¤ç
+ Object: f == null ? 0 : f.hashCode()
+ array: å
è®¡ç®æ¯ä¸ªå
ç´ çhashCodeï¼åæç
§intå¤ç
+ 对æ¯ä¸ªfield计ç®çcï¼result = 31 * result + c
+ è¿åresult
+ ç¼åæµä¾
+ 计ç®hashCodeæ¶ï¼ä¸éè¦çfieldï¼æªåä¸equals夿ï¼ä¸è¦åä¸è®¡ç®
+ Item 10: éåtoString()æ¹æ³
+ å¢å å¯è¯»æ§ï¼ç®æ´ãå¯è¯»ãå
·æä¿¡æ¯é
+ Item 11: æ
ééåcloneæ¹æ³
+ Cloneableæ¥å£æ¯ä¸ä¸ªmixin interfaceï¼ç¨äºè¡¨æä¸ä¸ªå¯¹è±¡å¯ä»¥è¢«clone
+ Contract
+ x.clone() != x
+ x.clone().getClass() == x.getClass()ï¼è¦æ±å¤ªå¼±ï¼å½ä¸ä¸ªéfinalç±»éåcloneæ¹æ³çæ¶åï¼å建ç对象ä¸å®è¦éè¿super.clone()æ¥è·å¾ï¼ææç¶ç±»é½éµå¾ªåæ ·çååï¼å¦æ¤æç»éè¿Object.clone()å建对象ï¼è½ä¿è¯åå»ºçæ¯æ£ç¡®çç±»å®ä¾ãèè¿ä¸ç¹å¾é¾ä¿è¯ã
+ x.clone().equals(x)
+ ä¸è°ç¨æé 彿°ï¼è¦æ±å¤ªå¼ºï¼ä¸è¬é½ä¼å¨clone彿°éé¢è°ç¨
+ å¯¹äºæååé齿¯primitive typeçç±»ï¼ç´æ¥è°ç¨super.clone()ï¼ç¶åcast为èªå·±çç±»åå³å¯ï¼éåæ¶å
许è¿å被éåç±»è¿åç±»åçåç±»ï¼ä¾¿äºä½¿ç¨æ¹ï¼ä¸å¿
æ¯æ¬¡castï¼
+ æååéå
å«å¯¹è±¡ï¼å
æ¬primitive typeæ°ç»ï¼ï¼å¯ä»¥éè¿éå½è°ç¨æåçcloneæ¹æ³å¹¶èµå¼æ¥å®ç°
+ ç¶èä¸è¿°æ¹å¼è¿èäºfinalç使ç¨åè®®ï¼finalæåä¸å
è®¸åæ¬¡èµå¼ï¼ç¶ècloneæ¹æ³éé¢å¿
é¡»è¦å¯¹å
¶èµå¼ï¼åæ æ³ä½¿ç¨finalä¿è¯ä¸å¯åæ§äº
+ éå½è°ç¨æåçcloneæ¹æ³ä¹ä¼å卿§è½é®é¢ï¼å¯¹HashTableéå½è°ç¨æ·±æ·è´ä¹å¯è½å¯¼è´StackOverFlowï¼å¯ä»¥éè¿éåæ·»å æ¥é¿å
ï¼
+ ä¼é
çæ¹å¼æ¯éè¿super.clone()å建对象ï¼ç¶å为æååé设置ç¸åçå¼ï¼è䏿¯ç®åå°éå½è°ç¨æåçcloneæ¹æ³
+ åæé 彿°ä¸æ ·ï¼å¨cloneçè¿ç¨ä¸ï¼ä¸è½è°ç¨non finalçæ¹æ³ï¼å¦æè°ç¨è彿°ï¼é£ä¹è¯¥å½æ°ä¼ä¼å
æ§è¡ï¼èæ¤æ¶è¢«cloneçå¯¹è±¡ç¶æè¿æªå®æclone/constructï¼ä¼å¯¼è´corruptionãå æ¤ä¸ä¸æ¡ä¸æåçâ设置ç¸åçå¼âæè°ç¨çæ¹æ³ï¼è¦æ¯finalæè
privateã
+ é载类çcloneæ¹æ³å¯ä»¥çç¥å¼å¸¸è¡¨çå®ä¹ï¼å¦æéåæ¶æå¯è§æ§æ¹ä¸ºpublicï¼ååºè¯¥çç¥ï¼ä¾¿äºä½¿ç¨ï¼å¦æè®¾è®¡ä¸ºåºè¯¥è¢«ç»§æ¿ï¼ååºè¯¥éåå¾åObjectç䏿 ·ï¼ä¸ä¸åºè¯¥å®ç°Cloneableæ¥å£ï¼å¤çº¿ç¨é®é¢ä¹éè¦èèï¼
+ è¦å®ç°cloneæ¹æ³çç±»ï¼é½åºè¯¥å®ç°Cloneableæ¥å£ï¼åæ¶æcloneæ¹æ³å¯è§æ§è®¾ä¸ºpublicï¼è¿åç±»å为èªå·±ï¼åºè¯¥è°ç¨super.clone()æ¥å建对象ï¼ç¶åæå¨è®¾ç½®æ¯ä¸ªåçå¼
+ cloneæ¹æ³å¤ªè¿å¤æï¼å¦æä¸å®ç°Cloneableæ¥å£ï¼ä¹å¯ä»¥éè¿å«çæ¹å¼å®ç°copyåè½ï¼æè
䏿ä¾copyåè½ï¼immutableæä¾copyåè½æ¯æ æä¹ç
+ æä¾æ·è´æé 彿°ï¼æè
æ·è´å·¥åæ¹æ³ï¼è䏿¤ç§æ¹æ³æ´å æ¨èï¼ä½ä¹æå
¶ä¸è¶³
+ è®¾è®¡ç¨æ¥è¢«ç»§æ¿çç±»æ¶ï¼å¦æä¸å®ç°ä¸ä¸ªæ£ç¡®é«æçcloneéåï¼é£ä¹å
¶åç±»ä¹å°æ æ³å®ç°æ£ç¡®é«æçcloneåè½
+ Item 12: å½å¯¹è±¡èªç¶æåºæ¶ï¼å®ç°Comparableæ¥å£
+ å®ç°Comparableæ¥å£å¯ä»¥å©ç¨å
¶æåºæ§ç¹ç¹ï¼æé«éå使ç¨/æç´¢/æåºçæ§è½
+ Contact
+ sgn(x.compareTo(y)) == - sgn(y.compareTo(x))ï¼å½ç±»åä¸å¯¹æ¶ï¼åºè¯¥æåºClassCastExceptionï¼æåºå¼å¸¸çè¡ä¸ºåºè¯¥æ¯ä¸è´ç
+ transitive: x.compareTo(y) > 0 && y.compareTo(z) > 0 ==> x.compareTo(z) > 0
+ x.compareTo(y) == 0 ==> sgn(x.compareTo(z)) == sgn(y.compareTo(z))
+ 建议ï¼ä½éå¿
é¡»ï¼ä¸equalsä¿æä¸è´ï¼å³ x.compareTo(y) == 0 ==> x.equals(y)ï¼å¦æä¸ä¸è´ï¼éè¦å¨ææ¡£ä¸æç¡®æåº
+ TreeSet, TreeMapç使ç¨çå°±æ¯æåºä¿åï¼èHashSet, HashMap忝éè¿equals + hashCodeä¿å
+ å½è¦ä¸ºä¸ä¸ªå®ç°äºComparableæ¥å£çç±»å¢å æååéæ¶ï¼ä¸è¦éè¿ç»§æ¿æ¥å®ç°ï¼èæ¯ä½¿ç¨ç»åï¼å¹¶æä¾åæå¯¹è±¡çè®¿é®æ¹æ³ï¼ä»¥ä¿æå¯¹Contractçéµå¾ª
+ å®ç°ç»è
+ ä¼å
æ¯è¾éè¦çå
+ è°¨æ
使ç¨è¿åå·®å¼çæ¹å¼ï¼æå¯è½ä¼æº¢åº
## Classes and Interfaces
+ Item 13: æå°åç±»ãæåçå¯è§æ§
+ å°è£
ï¼éèï¼ï¼å
¬å¼çæ¥å£éè¦æ´é²ï¼èæ¥å£çå®ç°åéè¦éèï¼ä½¿å¾æ¥å£ä¸å®ç°è§£è¦ï¼é使¨¡åè¦å度ï¼å¢å 坿µè¯æ§ãç¨³å®æ§ãå¯ç»´æ¤æ§ãå¯ä¼åæ§ãå¯ä¿®æ¹æ§
+ 妿ä¸ä¸ªç±»åªå¯¹ä¸ä¸ªç±»å¯è§ï¼ååºè¯¥å°å
¶å®ä¹ä¸ºç§æçå
é¨ç±»ï¼è没å¿
è¦publicçç±»é½åºè¯¥å®ä¹ä¸ºpackage private
+ 为äºä¾¿äºæµè¯ï¼å¯ä»¥é彿¾æ¾å¯è§æ§ï¼ä½ä¹åªåºè¯¥æ¹ä¸ºpackage privateï¼ä¸è½æ´é«
+ æåä¸è½æ¯éprivateçï¼å°¤å
¶æ¯å¯åç对象ã䏿¦å¤é¨å¯è®¿é®ï¼å°å¤±å»å¯¹å
¶å
å®¹çæ§å¶è½åï¼èä¸ä¼æå¤çº¿ç¨é®é¢
+ æ´é²ç常éä¹ä¸è½æ¯å¯åç对象ï¼å¦åpublic static finalä¹å°å¤±å»å
¶æä¹ï¼finalæåæ æ³æ¹åå
¶æåï¼ä½å
¶æåçå¯¹è±¡å´æ¯å¯åçï¼immutableç对象é¤å¤ï¼ï¼é¿åº¦é0çæ°ç»åæ ·ä¹æ¯æé®é¢çï¼å¯ä»¥èèæ¯æ¬¡è®¿é®æ¶å建æ·è´ï¼æè
使ç¨`Collections.unmodifiableList(Arrays.asList(arr))`
+ Item 14: public classä¸ï¼ä½¿ç¨accessor methodèépublic field
+ åè
å¤é¨å¯ä»¥ç´æ¥è®¿é®ï¼å¤±å»äºå®å
¨æ§
+ package privateæè
privateåå¯ä»¥ä¸å¿
è¿æ ·
+ æimmutableçfield置为publicå强å¯ä»¥æ¥åï¼mutableçæåä¸å®ä¸è½ç½®ä¸ºpublic
+ Item 15: æå°åå¯åæ§
+ 䏿ä¾å¯ä»¥æ¹åæ¬å¯¹è±¡ç¶æçæ¹æ³
+ ä¿è¯ç±»ä¸å¯è¢«ç»§æ¿
+ 使ç¨final field
+ 使ç¨private field
+ 卿é 彿°ãaccessorä¸ï¼å¯¹mutable field使ç¨defensive copy
+ å®ç°å»ºè®®
+ æä½å½æ°ï¼ä¾å¦BigIntegerçaddæ¹æ³ï¼ä¸æ¯staticçï¼ä½ä¹ä¸è½æ¹åæ¬å¯¹è±¡çç¶æï¼å使ç¨functionalçæ¹å¼ï¼è¿åä¸ä¸ªæ°ç对象ï¼å
¶ç¶ææ¯æ¬å¯¹è±¡ä¿®æ¹ä¹åçç¶æ
+ 妿¤å®ç°çimmutableå¯¹è±¡çæ¥å°±æ¯çº¿ç¨å®å
¨çï¼æ é忥æä½ï¼ä½åºè¯¥é¼å±å
±ç¨å®ä¾ï¼é¿å
å建è¿å¤éå¤ç对象
+ æ£ç¡®å®ç°çimmutable对象ä¹ä¸éè¦clone, copyæ¹æ³ï¼å¯ä»¥éå½å¼å
¥Object cacheï¼
+ å£å¿
+ æ¯ä¸ä¸ªå¼é½éè¦ä¸ä¸ªå¯¹è±¡ï¼è°ç¨æ¹åç¶æçæ¹æ³èå建ä¸ä¸ªæ°ç对象ï¼å°¤å
¶æ¯å®æ¯éé级çï¼å¼éä¼å大ï¼è¿ç»è°ç¨è¿æ ·çæ¹æ³ï¼å½±åæ´å¤§ï¼
+ 为常ç¨ç夿¬¡æä½ç»åæä¾ä¸ä¸ªæ¹æ³
+ å
¶ä»
+ ä¿è¯classæ æ³è¢«ç»§æ¿ï¼é¤äºå£°æä¸ºfinalå¤ï¼è¿å¯ä»¥å°é»è®¤æé 彿°å£°æä¸ºprivateæpackage privateï¼ç¶åæä¾public static工忹æ³
+ 使ç¨public static工忹æ³ï¼å
·ä½å®ç°ç±»å¯ä»¥æå¤ä¸ªï¼è¿è½è¿è¡object cache
+ å½å®ç°Serializableæ¥å£æ¯ï¼ä¸å®è¦å®ç°readObject/readResolveæ¹æ³ï¼æè
使ç¨ObjectOutputStream.writeUnshared/ObjectInputStream.readUnshared
+ å°ç»
+ é¤éæå¾å¥½ççç±è®©ä¸ä¸ªClass mutableï¼å¦ååºè¯¥ä½¿å
¶immutable
+ 妿éè¦mutableï¼ä¹åºå°½å¯è½éå¶å
¶å¯åæ§
+ Item 16: Favor composition (and forwarding) over inheritance
+ è·¨å
ç»§æ¿ãç»§æ¿ä¸æ¯è¢«è®¾è®¡ä¸ºåºè¯¥è¢«ç»§æ¿çå®ç°ç±»ï¼æ¯ä¸ä»¶å¾å±é©çäºæ
ï¼ç»§æ¿æ¥å£ãç»§æ¿æ½è±¡ç±»ï¼å½ç¶æ¯æ²¡é®é¢ç
+ 妿åç±»çåè½ä¾èµäºç¶ç±»çå®ç°ç»èï¼é£ä¹ä¸æ¦ç¶ç±»åçååï¼åç±»å°æå¯è½åºç°Bugï¼å³ä¾¿ä»£ç 齿²¡æä¿®æ¹ï¼è设计为åºè¢«ç»§æ¿çç±»ï¼å¨ä¿®æ¹åï¼æ¯åºè¯¥æææ¡£è¯´æçï¼åç±»å¼åè
æ¢å¯ä»¥å¾ç¥ï¼ä¹å¯ä»¥ç¥éå¦ä½ä¿®æ¹
+ ä¾åï¼ç»è®¡HashSetæ·»å å
ç´ çæ¬¡æ°
+ ç¨ç»§æ¿æ¹å¼ï¼éåaddï¼addAllï¼å¨å
¶ä¸è®¡æ°ï¼è¿å°±ä¸å¯¹ï¼å 为HashSetå
é¨çaddAllæ¯éè¿è°ç¨addå®ç°ç
+ 使¯éè¿ä¸éåaddAllä¹åªä¸å¯¹çï¼ä»¥åæå¯è½HashSetçå®ç°å°±åäº
+ å¨éåä¸éæ°å®ç°ä¸éç¶ç±»çé»è¾ä¹æ¯è¡ä¸éçï¼å 为è¿å¯è½ä¼å¯¼è´æ§è½é®é¢ãbugçï¼è䏿äºåè½ä¸è®¿é®ç§ææå乿¯æ æ³å®ç°ç
+ è¿æä¸ä¸ªåå å°±æ¯ç¶ç±»çå®ç°ä¸ï¼å¯è½ä¼å¢å æ¹æ³ï¼æ¹åå
¶è¡ä¸ºï¼èè¿ä¸ç¹ï¼å¨åç±»ä¸æ¯æ æ³æ§å¶ç
+ èéè¿ç»åçæ¹å¼ï¼å°ä¸ä¼æè¿äºé®é¢ï¼æå¦ä¸ä¸ªç±»ç对象声æä¸ºç§ææåï¼å¤é¨å°æ æ³è®¿é®å®ï¼èªå·±ä¹è½å¨è½¬åï¼forwardingï¼è¿ç¨ä¸æ§è¡æ¦æªæä½ï¼ä¹ä¸å¿
ä¾èµå
¶å®ç°ç»èï¼è¿ç§ç»åã转åçå®ç°è¢«ç§°ä¸ºwrapperï¼æè
Decorator patternï¼æè
delegationï¼ä¸¥æ ¼æ¥è¯´ä¸æ¯ä»£çï¼ä»£çä¸è¬wrapper对象é½éè¦æèªå·±ä¼ å
¥å°è¢«wrapçå¯¹è±¡æ¹æ³ä¸ï¼ï¼
+ 缺ç¹
+ ä¸éç¨äºcallback frameworksï¼
+ ç»§æ¿åºè¯¥å¨is-açåºæ¯ä¸ä½¿ç¨
+ ç»§æ¿é¤äºä¼ç»§æ¿ç¶ç±»çAPIåè½ï¼ä¹ä¼ç»§æ¿ç¶ç±»ç设计缺é·ï¼èç»ååå¯ä»¥éèæåç±»ç设计缺é·
+ Item 17: Design and document for inheritance or else prohibit it
+ ä¸ä¸ªç±»å¿
é¡»å¨ææ¡£ä¸è¯´æï¼æ¯ä¸ªå¯éåçæ¹æ³ï¼å¨è¯¥ç±»çå®ç°ä¸çåªäºå°æ¹ä¼è¢«è°ç¨ï¼the class must document its self-use of overridable methodsï¼ãè°ç¨æ¶æºã顺åºãç»æäº§ççå½±åï¼å
æ¬å¤çº¿ç¨ãåå§åçæ
åµã
+ 被继æ¿ç±»åºè¯¥éè¿è°¨æ
éæ©protectedçæ¹æ³ææåï¼æ¥æä¾ä¸äºhookï¼ç¨äºæ¹åå
¶å
é¨çè¡ä¸ºï¼ä¾å¦java.util.AbstractList::removeRangeã
+ The only way to test a class designed for inheritance is to write subclasses. ç¨äºå¤ææ¯å¦éè¦å¢å æè
åå°protectedæå/æ¹æ³ï¼é常å3个å类就差ä¸å¤äºã
+ You must test your class by writing subclasses before you release it.
+ Constructors must not invoke overridable methods. ç¶ç±»çæé 彿°æ¯åç±»çæé 彿°å
æ§è¡ï¼è妿ç¶ç±»æé 彿°ä¸è°ç¨äºå¯éåçæ¹æ³ï¼é£ä¹å°±ä¼å¯¼è´åç±»çéåæ¹æ³æ¯åç±»çæé 彿°å
æ§è¡ï¼ä¼å¯¼è´corruptionã
+ 妿å®ç°äºSerializable/Cloneableæ¥å£ï¼neither clone nor readObject may invoke an overridable method, directly or indirectly. éåæ¹æ³ä¼å¨deserialized/fix the cloneâs stateä¹åæ§è¡ã
+ 妿å®ç°äºSerializableæ¥å£ï¼readResolve/writeReplaceå¿
é¡»æ¯protectedï¼èéprivate
+ designing a class for inheritance places substantial limitations on the class.
+ The best solution to this problem is to prohibit subclassing in classes that are not designed and documented to be safely subclassed. 声æä¸ºfinal classæè
ææé 彿°ç§æåï¼æä¾public static工忹æ³ï¼ã
+ å¦æç¡®å®æ³è¦å
许继æ¿ï¼å°±åºè¯¥ä¸ºæ¯ä¸ªè¢«èªå·±ä½¿ç¨çå¯éåæ¹æ³é½åå¥½ææ¡£
+ Item 18: Prefer interfaces to abstract classes
+ Javaç±»åªå
许åç»§æ¿ï¼æ¥å£å¯ä»¥å¤ç»§æ¿ï¼ä½¿ç¨æ¥å£å®ä¹ç±»åï¼ä½¿å¾class hierarchyæ´å çµæ´»
+ å®ä¹mixinï¼optional functionality to be "mixed in"ï¼æ¶ä½¿ç¨interfaceæ¯å¾æ¹ä¾¿çï¼éè¦å¢å æ¤åè½çç±»åªéè¦implement该æ¥å£å³å¯ï¼èå¦æä½¿ç¨æ½è±¡ç±»ï¼åæ æ³å¢å ä¸ä¸ªextendsè¯å¥
+ æ¥å£å
许æå»ºæ²¡æhierarchyçç±»åç³»ç»
+ ä½¿ç¨æ¥å£å®ä¹ç±»åï¼å¯ä»¥ä½¿å¾item 16䏿å°çwrapperæ¨¡å¼æ´å å®å
¨ã强大ï¼
+ skeletal implementationï¼è¯¥ç±»ä¸ºabstractï¼æå¿
é¡»ç±clientå®ç°çæ¹æ³è®¾ä¸ºabstractï¼å¯ä»¥æé»è®¤å®ç°çåæä¾é»è®¤å®ç°
+ simulated multiple inheritanceï¼éè¿å®ç°å®ä¹çæ¥å£ï¼åæ¶å¨å
é¨å®ç°ä¸ä¸ªå¿åçskeletal implementationï¼å°å¯¹å¯¹è¯¥æ¥å£çè°ç¨è½¬åå°å¿åç±»ä¸ï¼èµ·å°âå¤ç»§æ¿âçææ
+ simple implementationï¼æä¾ä¸ä¸ªéæ½è±¡çæ¥å£å®ç°ç±»ï¼æä¾ä¸ä¸ªæç®åãè½workçå®ç°ï¼ä¹å
许被继æ¿
+ ä½¿ç¨æ¥å£å®ä¹ç±»åç缺ç¹ï¼ä¸ä¾¿äºæ¼è¿ï¼ä¸æ¦æ¥å£åå¸ï¼å¦ææ³è¦å¢å åè½ï¼å¢å æ¹æ³ï¼ï¼åclientå°æ æ³ç¼è¯ï¼è使ç¨abstract classï¼åæ²¡ææ¤é®é¢ï¼åªéè¦æä¾é»è®¤å®ç°å³å¯
+ å°ç»
+ éè¿æ¥å£å®ä¹ç±»åï¼å¯ä»¥å
许å¤å®ç°ï¼å¤ç»§æ¿ï¼
+ 使¯æ¼è¿éæ±å¤§äºçµæ´»æ§ãåè½æ§æ¶ï¼æ½è±¡ç±»æ´åé
+ æä¾æ¥å£æ¶ï¼æä¾ä¸ä¸ªskeletal implementationï¼åæ¶å®¡æ
èèæ¥å£è®¾è®¡
+ Item 19: ä»
ä»
ç¨interfaceå»å®ä¹ä¸ä¸ªç±»åï¼è¯¥æ¥å£åºè¯¥æå®ç°ç±»ï¼ä½¿ç¨è
éè¿æ¥å£å¼ç¨ï¼å»è°ç¨æ¥å£çæ¹æ³
+ é¿å
ç¨æ¥å£å»å®ä¹å¸¸éï¼åºè¯¥ç¨noninstantiable utility classå»å®ä¹å¸¸é
+ ç¸å
³å¸¸éçå½åï¼éè¿å
Œ
±åç¼æ¥å®ç°åç»
+ Item 20: Prefer class hierarchies to tagged classes
+ tagged class: å¨å
é¨å®ä¹ä¸ä¸ªtagåéï¼ç±å
¶æ§å¶åè½ç转æ¢
+ tag classes are verbose, error-prone, and inefficient
+ èclass hierarchyï¼ä¸ååè½ç±ä¸ååç±»å®ç°ï¼å
Œ
±é¨åæ½è±¡ä¸ºä¸ä¸ªåºç±»ï¼ä¹è½åæ åºå个åç±»ä¹é´çå
³ç³»
+ Item 21: Use function objects to represent strategies
+ åªæä¾ä¸ä¸ªåè½å½æ°çç±»å®ä¾ï¼æ²¡ææååéï¼åªéä¸ä¸ªå¯¹è±¡ï¼åä¾ï¼ï¼ä¸ºå
¶åè½å®ä¹ä¸ä¸ªæ¥å£ï¼åå¯ä»¥å®ç°çç¥æ¨¡å¼ï¼æå
·ä½çç¥ä¼ å
¥ç¸åºå½æ°ä¸ï¼ä½¿ç¨çç¥
+ å
·ä½ççç¥å®ä¾é常使ç¨å¿åç±»å®ä¹ï¼è°ç¨ä½¿ç¨è¯¥çç¥çæ¹æ³æ¶æäºä»¥å建/é¢å
å建好ä¹åæ¯æ¬¡å°å
¶ä¼ å
¥
+ Item 22: Favor static member classes over nonstatic
+ æ4ç§nested classï¼non-static member class; static member class(inner class); anonymous class; local class
+ static member class
+ ç»å¸¸ä½ä¸ºhelper classï¼åå¤é¨ç±»ä¸èµ·ä½¿ç¨
+ 妿nested classççå½å¨æç¬ç«äºå¤é¨ç±»åå¨ï¼åå¿
é¡»å®ä¹ä¸ºstatic member classï¼å¦åå¯è½é æå
åæ³æ¼
+ private static member classç¨å¤ä¸ï¼è¡¨ç¤ºï¼å°è£
ï¼å¤é¨ç±»çä¸äºæåï¼ä¾å¦MapçEntryå
é¨ç±»ã
+ non-static member class
+ å°ææå¤é¨ç±»å®ä¾ç强å¼ç¨ï¼å¯ä»¥ç´æ¥å¼ç¨å¤é¨ç±»çæååæ¹æ³
+ ç¨å¤ä¸ï¼å®ä¹ä¸ä¸ªAdapterï¼ä½¿å¾å¤é¨å
çå®ä¾ï¼å¯ä»¥ä½ä¸ºåå¤é¨ç±»è¯ä¹ä¸åçå®ä¾æ¥æ¥çï¼è®¿é®ï¼ï¼ä¾å¦CollectionçIteratorã
+ 妿nested classä¸éè¦å¼ç¨å¤é¨ç±»çæååæ¹æ³ï¼åä¸å®è¦å°å
¶å®ä¹ä¸ºstaticï¼é¿å
空é´/æ¶é´å¼éï¼é¿å
å
åæ³æ¼
+ anonymous class
+ å½å¨éstatic代ç åå
å®ä¹æ¶ï¼ä¼ææå¤é¨ç±»çå¼ç¨ï¼å¦åä¸ä¼ææ
+ éå¶
+ åªè½å¨è¢«å£°æçå°æ¹è¿è¡å®ä¾å
+ æ æ³è¿è¡instanceofæµè¯
+ ä¸è½ç¨å¿åç±»å®ç°å¤ä¸ªæ¥å£
+ ä¸è½ç¨å¿å类继æ¿ä¸ä¸ªç±»çåæ¶å®ç°æ¥å£
+ å¿åç±»ä¸æ°æ·»å çæ¹æ³æ æ³å¨å¿åç±»å¤é¨è®¿é®
+ ä¸è½æstaticæå
+ åºè¯¥å°½éä¿æç®ç
+ ç¨å¤ä¸ï¼å建function object
+ ç¨å¤äºï¼å建process objectï¼ä¾å¦ï¼Runnable, Thread, TimberTask
+ ç¨å¤ä¸ï¼ç¨äºpublic static工忹æ³ï¼ä¾å¦Collectionsç±»éé¢çä¸äºå·¥åæ¹æ³ï¼å¾å¤æ¯è¿åä¸ä¸ªå¿åçå
é¨å®ç°
+ local class
+ æ¯è¾å°ç¨
+ æ¯å¦staticåå³äºå
¶å®ä¹çä¸ä¸æ
+ å¯ä»¥å¨ä½ç¨åå
éå¤ä½¿ç¨
+ ä¸è½æstaticæå
+ ä¹åºå°½éä¿æç®ç
+ å°ç»
+ åç§nested class
+ 妿nested class卿´ä¸ªå¤é¨ç±»å
é½éè¦å¯è§ï¼æè
å®ä¹ä»£ç 太é¿ï¼åºä½¿ç¨member class
+ è½staticå°±ä¸å®è¦staticï¼å³ä¾¿éè¦å¯¹å¤é¨ç±»è¿è¡å¼ç¨ï¼å¯¹äºçå½å¨æç¬ç«äºå¤é¨ç±»çï¼ä¹åºè¯¥éè¿WeakReferenceè¿è¡å¼ç¨ï¼é¿å
å
åæ³æ¼ï¼è³äºçå½å¨æåå¤é¨ç±»ä¸è´çï¼åä¸å¿
è¿æ ·
## Generics
+ Item 23: Donât use raw types in new code
+ Javaæ³åï¼ä¾å¦`List`ï¼çæ£ä½¿ç¨çæ¶å齿¯`List`çï¼æEæ¿æ¢ä¸ºå®é
çç±»å
+ Javaæ³åä»1.5å¼å
¥ï¼ä¸ºäºä¿æå
¼å®¹æ§ï¼å®ç°çæ¯ä¼ªæ³åï¼ç±»ååæ°ä¿¡æ¯å¨ç¼è¯å®æä¹åé½ä¼è¢«æ¦é¤ï¼å
¶å¨è¿è¡æ¶çç±»å齿¯raw typeï¼ç±»ååæ°ä¿åç齿¯Objectç±»åï¼`List`çraw typeå°±æ¯`List`
+ ç¼è¯å¨å¨ç¼è¯æéè¿ç±»ååæ°ï¼ä¸ºè¯»æä½èªå¨è¿è¡äºç±»å强å¶è½¬æ¢ï¼åæ¶å¨åæä½æ¶èªå¨è¿è¡äºç±»åæ£æ¥
+ å¦æä½¿ç¨raw typeï¼é£ç¼è¯å¨å°±ä¸ä¼å¨åæä½æ¶è¿è¡ç±»åæ£æ¥äºï¼åå
¥é误çç±»åä¹ä¸ä¼æ¥ç¼è¯é误ï¼é£ä¹å¨åç»è¯»æä½è¿è¡å¼ºå¶ç±»åè½¬æ¢æ¶ï¼å°ä¼å¯¼è´è½¬æ¢å¤±è´¥ï¼æåºå¼å¸¸
+ 䏿¦é误åçï¼åºè¯¥è®©å®å°½æ©è¢«ç¥éï¼æåº/æè·ï¼ï¼ç¼è¯ææ¾ç¶ä¼äºè¿è¡æ
+ `List`ä¸`List