【Effective Java】阅读
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覆 ...
随机推荐
- secureCrt常用命令
一.常用命令: 1.ls 只列出文件名 (相当于dir,dir也可以使用) -A:列出所有文件,包含隐藏文件. -l:列表形式,包含文件的绝大部分属性. -R:递归显示. --help:此命令的帮助. ...
- Opencv读取图片像素值并保存为txt文件
#include <opencv2/opencv.hpp>#include<vector>#include <fstream> using namespace st ...
- gearman client的doBackground 与doNormal方法的区别
doNormal方法是阻塞的,需要等到worker处理完之后才返回,否则一直阻塞住; doBackground 方法是非阻塞的,只要将数据发送到gearmand之后,就立马返回,不等待worker的处 ...
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...
- 数据结构_bubble_sort
问题描述 给定一个 1~N 的排列 P,即 1 到 N 中的每个数在 P 都只出现一次. 现在要对排列 P 进行冒泡排序,代码如下:for (int i = 1; i <= N; ++i)for ...
- <超越死亡:恩宠与勇气>节选
我有一副身体,但我并非自己的身体.我可以看见并感觉到我的身体,然而凡是可以被看见以及被感觉到的,并不是真正的观者.我的身体也许疲惫或兴奋,生病或健康,沉重或轻松,也可能焦虑或平静,但这与内在的真我全然 ...
- bat 操作数据库(附加,分离,删除,还原)
BAT代码: @echo off Title DataBase Color 0A :caozuo echo. echo ═══════════════════════════════════════ ...
- 字符串创建XML文档
创建XML文档,方法与形式是多样的,下面Insus.NET再例举两种,可供参考. XmlDocument(namespace:System.Xml)在实例化之后,它有一个方法LoadXml(),可以把 ...
- Lucene 全文检索 Lucene的使用
Lucene 全文检索 Lucene的使用 一.简介: 参考百度百科: http://baike.baidu.com/link?url=eBcEVuUL3TbUivRvtgRnMr1s44nTE7 ...
- spring分布式事务学习笔记(2)
此文已由作者夏昀授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Model类如下:package com.xy.model 1 package com.xy.model; ...