内容简介
《EffectiveJava(第2版英文版)》介绍了在Java编程中的78条非常具有实用价值的经验规则,这些经验规则涵盖了大部分开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么,以及怎样才能编写出清晰、健壮和高效的代码。《EffectiveJava(第2版)英文版》中的每条规则都以简短、独立的小文章形式出现,并通过示例代码进一步进行说明。《Effective Java(第2版 英文版)》内容全面,结构清晰,讲解详细,可作为技术人员的参考用书。
目录
推荐序
前言
1Introduction
2CreatingandDestroyingObjects
Item1:Considerstaticfactorymethodsinsteadofconstructors
Item2:Considerabuilderwhenfacedwithmanyconstructorparameters
Item3:Enforcethesingletonpropertywithaprivateconstructororanenumtype
Item4:Enforcenoninstantiabilitywithaprivateconstructor
Item5:Avoidcreatingunnecessaryobjects
Item6:Eliminateobsoleteobjectreferences
Item7:Avoidfinalizers
3MethodsCommontoAllObjects
Item8:Obeythegeneralcontractwhenoverridingequals
Item9:AlwaysoverridehashCodewhenyouoverrideequals
Item10:AlwaysoverridetoString
Item11:Overrideclonejudiciously
Item12:ConsiderimplementingComparable
4ClassesandInterfaces
Item13:Minimizetheaccessibilityofclassesandmembers
Item14:Inpublicclasses,useaccessormethods,notpublicfields
Item15:Minimizemutability
Item16:Favorcompositionoverinheritance
Item17:Designanddocumentforinheritanceorelseprohibitit
Item18:Preferinterfacestoabstractclasses
Item19:Useinterfacesonlytodefinetypes
Item20:Preferclasshierarchiestotaggedclasses
Item21:Usefunctionobjectstorepresentstrategies
Item22:Favorstaticmemberclassesovernonstatic
5Generics
Item23:Don’tuserawtypesinnewcode
Item24:Eliminateuncheckedwarnings
Item25:Preferliststoarrays
Item26:Favorgenerictypes
Item27:Favorgenericmethods
Item28:UseboundedwildcardstoincreaseAPIflexibility
Item29:Considertypesafeheterogeneouscontainers
6EnumsandAnnotations
Item30:Useenumsinsteadofintconstants
Item31:Useinstancefieldsinsteadofordinals
Item32:UseEnumSetinsteadofbitfields
Item33:UseEnumMapinsteadofordinalindexing
Item34:Emulateextensibleenumswithinterfaces
Item35:Preferannotationstonamingpatterns
Item36:ConsistentlyusetheOverrideannotation
Item37:Usemarkerinterfacestodefinetypes
7Methods
Item38:Checkparametersforvalidity
Item39:Makedefensivecopieswhenneeded
Item40:Designmethodsignaturescarefully
Item41:Useoverloadingjudiciously
Item42:Usevarargsjudiciously
Item43:Returnemptyarraysorcollections,notnulls
Item44:WritedoccommentsforallexposedAPIelements
8GeneralProgramming
Item45:Minimizethescopeoflocalvariables
Item46:Preferfor-eachloopstotraditionalforloops
Item47:Knowandusethelibraries
Item48:Avoidfloatanddoubleifexactanswersarerequired
Item49:Preferprimitivetypestoboxedprimitives
Item50:Avoidstringswhereothertypesaremoreappropriate
Item51:Bewaretheperformanceofstringconcatenation
Item52:Refertoobjectsbytheirinterfaces
Item53:Preferinterfacestoreflection
Item54:Usenativemethodsjudiciously
Item55:Optimizejudiciously
Item56:Adheretogenerallyacceptednamingconventions
9Exceptions
Item57:Useexceptionsonlyforexceptionalconditions
Item58:Usecheckedexceptionsforrecoverableconditionsandruntimeexceptionsforprogrammingerrors
Item59:Avoidunnecessaryuseofcheckedexceptions
Item60:Favortheuseofstandardexceptions
Item61:Throwexceptionsappropriatetotheabstraction
Item62:Documentallexceptionsthrownbyeachmethod
Item63:Includefailure-captureinformationindetailmessages
Item64:Striveforfailureatomicity
Item65:Don’tignoreexceptions
10Concurrency
Item66:Synchronizeaccesstosharedmutabledata
Item67:Avoidexcessivesynchronization
Item68:Preferexecutorsandtaskstothreads
Item69:Preferconcurrencyutilitiestowaitandnotify
Item70:Documentthreadsafety
Item71:Uselazyinitializationjudiciously
Item72:Don’tdependonthethreadscheduler
Item73:Avoidthreadgroups
11Serialization
Item74:ImplementSerializablejudiciously
Item75:Considerusingacustomserializedform
Item76:WritereadObjectmethodsdefensively
Item77:Forinstancecontrol,preferenumtypestoreadResolve
Item78:Considerserializationproxiesinsteadofserializedinstances
Appendix:ItemsCorrespondingtoFirstEdition
References
Index
前言/序言
推荐序
如果有同事对你说,“Spouseofmethisnighttodaymanufacturestheunusualmealinahome.Youwilljoin?”这时候你脑子里可能会浮现出三件事情:同事在邀请你参加他的家庭晚宴,英语肯定不是你这位同事的母语,更多的则是满脑子的疑惑。
如果你曾经学习过第二种语言,并且尝试过在课堂之外使用这种语言,你就该知道有三件事情是必须掌握的:这门语言的结构如何(语法)、如何命名你想谈论的事物(词汇),以及如何以惯用和高效的方式来表达日常的事物(用法)。在课堂上大多只涉及到前面两点,当你使出浑身解数想让对方明白你的意思时,常常会发现当地人对你的表述忍俊不禁。
程序设计语言也是如此。你需要理解语言的核心:它是面向算法的,还是面向函数的,或者是面向对象的?你需要知道词汇表:标准类库提供了哪些数据结构、操作和功能设施(Facility)?你还需要熟悉如何用习惯和高效的方式来构建代码。也许是因为前面两点比较容易编写,所以关于程序设计语言的书籍通常只涉及这两点,或者只是蜻蜓点水般地介绍一下用法。语法和词汇是语言本身固有的特性,但是用法则反映了使用这门语言的群体特征。
例如,Java程序设计语言是一门支持单继承的面向对象程序设计语言,在每个方法的内部,它都支持命令式的(面向语句的,Statement-Oriented)编码风格。Java类库提供了对图形显示、网络、分布式计算和安全性的支持。但是,如何把这门语言以最佳的方式运用到实践中呢?
还有一点,程序与口头的句子以及大多数书籍和杂志都不同,它会随着时间的推移而发生变化。仅仅编写出能够有效地工作并且能够被别人理解的代码往往是不够的,我们还必须把代码组织成易于修改的形式。针对某个任务可能会有10种不同的编码方法,而在这10种编码方法中,有7种编码方法是笨拙的、低效的或者是难以理解的。而在剩下的3种编码方法中,哪一种会是最接近该任务的下一年度发行版本的代码呢?
目前有大量的书籍可以供你学习Java程序设计语言的语法,包括TheJavaProgrammingLanguage[Arnold05](作者Arnold、Gosling和Holmes),以及TheJavaLanguageSpecification[JLS](作者Gosling、Joy和Bracha)。同样地,与Java程序设计语言相关的类库和API的书籍也有很多。
《Effective Java(第2版 英文版)》解决了你的第三种需求,即如何以惯用和高效的方式来表达日常的事物(用法)。多年来,作者JoshuaBloch在SunMicrosystems公司一直从事Java语言的扩展、实现和使用的工作;他还大量地阅读了其他人的代码,包括我的代码。他在《Effective Java(第2版 英文版)》中提出了许多很好的建议,他系统地把这些建议组织起来,旨在告诉读者如何更好地构造代码以便它们能工作得更好,也便于其他人能够理解这些代码,而且将来对代码进行修改和改善时也不至于那么头疼。甚至,你的程序也会因此而变得更加令人愉悦、更加优美和雅致。
GuyL.SteeleJr
BurlingtonMassachusetts
2001年4月