Java写了很多年,很惭愧,直到最近才读了这本经典之作《Effective Java》,按自己的理解总结下,有些可能还不够深刻
- Consider static factory methods instead of constructors (factory方法可以拥有名称,可以避免重复创建,比如单例模式)
- Consider a builder when faced with many constructor parameters(对于多个参数的比较适用,更加灵活,比如有两个相同类型参数的构造函数无法分辨的情况)
- Enforce the singleton property with a private constructor or an enum type(单例模式,1.5后用枚举实现更合适)
- Enforce noninstantiability with a private constructor (不允许实例化的对象写一个私有构造函数,以避免滥用,比如工具类)
- Avoid creating unnecessary objects (不要多余的创建类,比如在循环中去反复创建对象,特别需要避免的是基本类型和装箱类型的反复转换)
- Eliminate obsolete object references (比如对于pop操作,pop一个元素后要把数组的那一位无用的元素置为null)
- Avoid finalizers(除了一些关闭资源操作,不要再finally里包含不必要的处理)
- Obey the general contract when overriding equals (equals方法覆盖时参数等必须对照上)
- Always override hashcode when override equals (equals覆盖时hashcode方法也要override,因为在集合类中的操作时为了快速会先比较hashcode)
- Always override toString (主要是为了使外界更容易了解实例信息)
- Override clone judiciously (clone方法要保证不改变原有实例)
- Consider implementing Comparable (对于需要排序的情况,实现Comparable接口是个好的选择)
- Minimize the accessibility of classes and members (只给类和方法最小的访问权限是防止滥用的第一步)
- In public classes, user accessor methods, not public fields (这也是POJO的原因,因为可以在get,set方法里做额外的事情并且对于变化可控)
- Minimize mutability (尽可能限制可变,对于不需要变更要限制,加上final,private等限制)
- Favor composition over inheritance (组合优先于继承,其实继承是对封闭原则的一种破坏)
- Design and document for inheritance or else prohibit it (对于父类,需要写明注释)
- Prefer interfaces to abstract classes (接口优先于抽象类,因为继承只能是一个来源)
- Use interfaces only to define types (可用接口来声明类别)
- Preffer class hierachies to tagged classes (所谓的标签类是指一个类中拥有标签的属性,比如类可以被tag成圆形或者方形,这种情况用继承比较好)
- Use function objects to represent strategies (strategy pattern是策略模式,是允许在运行时选择算法的一种模式)
- Favor static member classes over nonstatic (对于不需要外界访问的内部类,用static是为了减少开销)
- Don't use raw types in new code (对于list,set等最好不要用raw类型,指明类型有助于提前让编译器发现错误)
- Eliminate unchecked warnings (也是为集合类而言)
- Prefer lists to arrays (推荐用list的原因也在于编译器可以发现错误,而数组不能检查元素类型)
- Favor generic types (E,V这种类型有助于代码复用)
- Use bounded wildcards to increase API flexibility (通配符?类型有助于API的灵活性)
- Consider typesafe heterogeneous containers
- Use enum instead of int constants (这个不用多说)
- Use instance fields instead of ordinals (对于枚举类,不要用ordinals来取其整数值)
- Use EnumSet instad of bit fields (用枚举集合来代替“位”属性,因为位移这种属性实在可读性差)
- Use EnumMap instead of ordinal indexing (用枚举的map代替ordinal方法来排序或者索引)
- Emulate extensible enums with interfaces (用接口实现枚举的可扩展性)
- Prefer annotations to naming patterns (注解的方法可以避免拼写等错误)
- Consistently use the Override annotation (如果是覆盖,用override注解能让编译器来检查错误)
- Use marker interfaces to define types (接口定义类型)
- Check parameters for validity (方法内检查参数的有效性是必要的)
- Make defensive copies then needed (所谓防卫性的copy,是为了防止外界构造实例后再次更改内部数据)
- Design method signatures carefully (方法的命名https://en.wikipedia.org/wiki/Naming_convention_(programming),参数个数不要过多)
- Use overloading judiciously (重载方法的选择是静态的,而重写方法的选择是动态的)
- Use varargs judiciously (可变参数的缺点运行时才会发现,可以用传递第一个必要的参数,剩下的用可变参数来解决)
- Return empty arrays or collections not nulls (减少空指针错误)
- Write doc comments for all exposed API elements (注释)
- Minimize the scope of local variables (封闭性原则)
- Prefer for-each loops to traditional for loops (减少中间参数使用)
- Know and use the libraries (尽量使用标准库的方法)
- Avoid float and double if exact answers are required (flocat,double是科学计算而生,如果需要精确值,使用int,long,BigDecimal代替)
- Prefer primitive types to boxed primitives (尽量使用基本类型)
- Avoid strings where other types are more approprivate (String虽然使用简单,但能用精确类型更好)
- Beware the performance of string concatenation (老生常谈问题,字符拼接用StringBuilder)
- Refer to obejects by their interfaces (用接口来做类型的引用会使代码更加灵活)
- Prefer interfaces to reflection (反射虽然好用但很多问题只有在运行时才能被发现)
- Use native methods judictiously (JVM为了支持多个语言允许native方法但一般不这样做,如果仅仅是为了提高性能)
- Optimize judiciously (改善性能的时候多考虑更改带来的后果)
- Adhere to generally accepted naming conventions (Java命名规范:http://docs.oracle.com/javase/specs/jls/se7/html/index.html)
- Use exception only for exceptional conditions (正常逻辑不应该用Exception)
- Use checked exceptions for recoverable conditons and runtime programming errors (需要继续操作的用checked exception)
- Avoid unnecessary use of check exceptions
- Favor the use of standard exceptions
- Throw exceptions appropriate to the abstraction
- Document all exceptions thrown by each method
- Include failure-capture information in detail message
- Strive for failure atomicity (异常的原子性)
- Don't ignore exceptions
- Synchronize access to shared mutable data
- Avoid excessive synchronization (同步不要泛滥)
- Prefer executors and tasks to threads
- Prefer concurrency utilities to wait and notify
- Document thread safety
- Use lazy initialization judiciously
- Don't depend on the thread scheduler
- Avoid thread groups
- Implement serializable judiciously
- Consider using a custom serialized form
- Write readObject method defensively
- For instance control, prefer enum types to readResolve
- Consider serializations proxies instead of serialized instances
【Effective Java】阅读的更多相关文章
-
Effective Java阅读笔记——引言
“我很希望10年前就拥有这本书.可能有人认为我不需要任何Java方面的书籍,但是我需要这本书.” ——Java之父 James Gosling 在图书馆找到这本java著作时,首先看到了这句话. ...
-
Effective Java 阅读笔记——并发
66:同步访问共享的可变数据 synchronized:1互斥,阻止线程看到的对象处于不一致的状态:2保证线程在进入同步区时能看到变量的被各个线程的所有修改 Java中,除了long或者double, ...
-
Effective Java 阅读笔记——枚举和注解
30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 31:用实例域代替序数 应该给enum添加i ...
-
Effective Java 阅读笔记——方法
38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违 ...
-
阅读《Effective Java》每条tips的理解和总结(1)
<Effective Java>这本书的结构是90来条tips,有长有短,每条tip都值的学习.这里根据对书中每条tip的理解做简短的总结,方便日后回顾.持续更新~ 1. 考虑用静态方法代 ...
-
effective java 读后感
think in java , effective java 这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
-
Effective Java 创建和销毁对象
<Effective Java>阅读笔记,用适合自己理解的方式提炼该书内容.<Effective Java>是一本很实用的书,阅读方法应该是快速的领会,总结,然后应用.而非,一 ...
-
Effective Java 电子书 apk版本下载
下载安装包以后,安装即可阅读该书了,并且实时展示每章节代码哦,并且可以运行哦,赶快下载体验吧. Effective Java中文第二版下载地址:下载 应用截图:
-
Effective Java实作hashCode() - 就是爱Java
hashCode()这个方法,也是定义在Object class中,这个是所有class的base class,因此所有的class也都继承这个方法,预设是传回这个对象储存的内存地址编号,因为Mix覆 ...
随机推荐
-
IOS7 edgesForExtendedLayout
在iOS 7中,苹果引入了一个新的属性,叫做[UIViewController setEdgesForExtendedLayout:],它的默认值为UIRectEdgeAll.当你的容器是naviga ...
-
[Linux]cmd to use
0x01 Linux Perfermance Analysis in 60s 1> uptime ---load averages 2> dmesg -r | tail ---kernel ...
-
优化PHP程序的方法(温故知新)
1. If a method c++an be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化 ...
-
HDU 3466
Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ...
-
llnq SqlMethods like
http://www.cnblogs.com/freeliver54/archive/2009/09/05/1560815.html http://www.cnblogs.com/chen1388/a ...
-
PHP ==与===的区别
PHP中==与===的区别 ===是恒等计算符 同时检查表达式的值与类型 ==是比较运算符号 不会检查条件式的表达式的类型
-
参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况
参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况.该值默认为0,表示当需要恢复时执行所有的恢复操作.当不能进行有效恢复时,如数据页发生了corruption,My ...
-
C++调Python示例(转载)
C++调Python,代码粘贴如下: #include <iostream> #include <Python.h> using namespace std; void Hel ...
-
uploadify上传带参数及接收参数的方法
function uploadify() { $("#uploadify").uploadify({ method:'post', uploader: '/Manage/Order ...
-
Zookeeper已经分布式环境中的假死脑裂
Zookeeper简介 在上班之前都不知道有这样一个东西,在开始说假死脑裂之前先说说Zookeeper吧. Zookeeper zookeeper是一个分布式应用程序的协调服务.它是一个为分布式应用提 ...