B02.高效Effective Java
原创大约 12 分钟
B02.高效Effective Java
此书非常薄,实操性非常强,是我多年来首推的工具书,在不同的能力水平,会看到不同的理解和收益。
以下Repo是中英文对照版,推荐优先阅读英文,再对照中文理解,技术词汇语义以英文单词为准。 https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual
英文阅读能力,是程序猿进阶的必备技能。就当前而言,先进的技术和社区都是英文的,只有具有英文能力, 才能够保持不掉队,并且对代码的命名也有莫大的好处。
B02A.规则列表
Creating and Destroying Objects
Chapter02. 创建和销毁对象- Item01: 考虑以静态工厂方法代替构造函数 Consider static factory methods instead of constructors
- Item02: 在面对多个构造函数参数时,请考虑构建器 Consider a builder when faced with many constructor parameters
- Item03: 使用私有构造函数或枚举类型实施单例属性 Enforce the singleton property with a private constructor or an enum type
- Item04: 用私有构造函数实施不可实例化 Enforce noninstantiability with a private constructor
- Item05: 依赖注入优于硬连接资源 Prefer dependency injection to hardwiring resources
- Item06: 避免创建不必要的对象 Avoid creating unnecessary objects
- Item07: 排除过时的对象引用 Eliminate obsolete object references
- Item08: 避免使用终结器和清除器 Avoid finalizers and cleaners
- Item09: 使用 try-with-resources 优于 try-finally Prefer try with resources to try finally
Methods Common to All Objects
Chapter03. 对象的通用方法- Item10: 覆盖 equals 方法时应遵守的约定 Obey the general contract when overriding equals
- Item11: 当覆盖 equals 方法时,总要覆盖 hashCode 方法 Always override hashCode when you override equals
- Item12: 始终覆盖 toString 方法 Always override toString
- Item13: 明智地覆盖 clone 方法 Override clone judiciously
- Item14: 考虑实现 Comparable 接口 Consider implementing Comparable
Classes and Interfaces
Chapter04. 类和接口- Item15: 尽量减少类和成员的可访问性 Minimize the accessibility of classes and members
- Item16: 在公共类中,使用访问器方法,而不是公共字段 In public classes use accessor methods not public fields
- Item17: 减少可变性 Minimize mutability
- Item18: 优先选择复合而不是继承 Favor composition over inheritance
- Item19: 继承要设计良好并且具有文档,否则禁止使用 Design and document for inheritance or else prohibit it
- Item20: 接口优于抽象类 Prefer interfaces to abstract classes
- Item21: 为后代设计接口 Design interfaces for posterity
- Item22: 接口只用于定义类型 Use interfaces only to define types
- Item23: 类层次结构优于带标签的类 Prefer class hierarchies to tagged classes
- Item24: 静态成员类优于非静态成员类 Favor static member classes over nonstatic
- Item25: 源文件仅限有单个顶层类 Limit source files to a single top level class
Generics
Chapter05. 泛型- Item26: 不要使用原始类型 Do not use raw types
- Item27: 消除 unchecked 警告 Eliminate unchecked warnings
- Item28: list 优于数组 Prefer lists to arrays
- Item29: 优先使用泛型 Favor generic types
- Item30: 优先使用泛型方法 Favor generic methods
- Item31: 使用有界通配符增加 API 的灵活性 Use bounded wildcards to increase API flexibility
- Item32: 明智地合用泛型和可变参数 Combine generics and varargs judiciously
- Item33: 考虑类型安全的异构容器 Consider typesafe heterogeneous containers
Enums and Annotations
Chapter06. 枚举和注解- Item34: 用枚举类型代替 int 常量 Use enums instead of int constants
- Item35: 使用实例字段替代序数 Use instance fields instead of ordinals
- Item36: 用 EnumSet 替代位字段 Use EnumSet instead of bit fields
- Item37: 使用 EnumMap 替换序数索引 Use EnumMap instead of ordinal indexing
- Item38: 使用接口模拟可扩展枚举 Emulate extensible enums with interfaces
- Item39: 注解优于命名模式 Prefer annotations to naming patterns
- Item40: 坚持使用 @Override 注解 Consistently use the Override annotation
- Item41: 使用标记接口定义类型 Use marker interfaces to define types
Lambdas and Streams
Chapter07. λ 表达式和流- Item42: λ 表达式优于匿名类 Prefer lambdas to anonymous classes
- Item43: 方法引用优于 λ 表达式 Prefer method references to lambdas
- Item44: 优先使用标准函数式接口 Favor the use of standard functional interfaces
- Item45: 明智地使用流 Use streams judiciously
- Item46: 在流中使用无副作用的函数 Prefer side effect free functions in streams
- Item47: 优先选择 Collection 而不是流作为返回类型 Prefer Collection to Stream as a return type
- Item48: 谨慎使用并行流 Use caution when making streams parallel
Methods
Chapter08. 方法- Item49: 检查参数的有效性 Check parameters for validity
- Item50: 在需要时制作防御性副本 Make defensive copies when needed
- Item51: 仔细设计方法签名 Design method signatures carefully
- Item52: 明智地使用重载 Use overloading judiciously
- Item53: 明智地使用可变参数 Use varargs judiciously
- Item54: 返回空集合或数组,而不是 null Return empty collections or arrays, not nulls
- Item55: 明智地的返回 Optional Return optionals judiciously
- Item56: 为所有公开的 API 元素编写文档注释 Write doc comments for all exposed API elements
General Programming
Chapter09. 通用程序设计- Item57: 将局部变量的作用域最小化 Minimize the scope of local variables
- Item58: for-each 循环优于传统的 for 循环 Prefer for-each loops to traditional for loops
- Item59: 了解并使用库 Know and use the libraries
- Item60: 若需要精确答案就应避免使用 float 和 double 类型 Avoid float and double if exact answers are required
- Item61: 基本数据类型优于包装类 Prefer primitive types to boxed primitives
- Item62: 其他类型更合适时应避免使用字符串 Avoid strings where other types are more appropriate
- Item63: 当心字符串连接引起的性能问题 Beware the performance of string concatenation
- Item64: 通过接口引用对象 Refer to objects by their interfaces
- Item65: 接口优于反射 Prefer interfaces to reflection
- Item66: 明智地使用本地方法 Use native methods judiciously
- Item67: 明智地进行优化 Optimize judiciously
- Item68: 遵守被广泛认可的命名约定 Adhere to generally accepted naming conventions
Exceptions
Chapter10. 异常- Item69: 仅在确有异常条件下使用异常 Use exceptions only for exceptional conditions
- Item70: 对可恢复情况使用 checked 异常,对编程错误使用运行时异常 Use checked exceptions for recoverable conditions and runtime exceptions for programming errors
- Item71: 避免不必要地使用 checked 异常 Avoid unnecessary use of checked exceptions
- Item72: 鼓励复用标准异常 Favor the use of standard exceptions
- Item73: 抛出能用抽象解释的异常 Throw exceptions appropriate to the abstraction
- Item74: 为每个方法记录会抛出的所有异常 Document all exceptions thrown by each method
- Item75: 异常详细消息中应包含捕获失败的信息 Include failure capture information in detail messages
- Item76: 尽力保证故障原子性 Strive for failure atomicity
- Item77: 不要忽略异常 Don’t ignore exceptions
Concurrency
Chapter11. 并发- Item78: 对共享可变数据的同步访问 Synchronize access to shared mutable data
- Item79: 避免过度同步 Avoid excessive synchronization
- Item80: Executor、task、流优于直接使用线程 Prefer executors, tasks, and streams to threads
- Item81: 并发实用工具优于 wait 和 notify Prefer concurrency utilities to wait and notify
- Item82: 文档应包含线程安全属性 Document thread safety
- Item83: 明智地使用延迟初始化 Use lazy initialization judiciously
- Item84: 不要依赖线程调度器 Don’t depend on the thread scheduler
Serialization
Chapter12. 序列化- Item85: 优先选择 Java 序列化的替代方案 Prefer alternatives to Java serialization
- Item86: 非常谨慎地实现 Serializable Implement Serializable with great caution
- Item87: 考虑使用自定义序列化形式 Consider using a custom serialized form
- Item88: 防御性地编写 readObject 方法 Write readObject methods defensively
- Item89: 对于实例控制,枚举类型优于 readResolve For instance control, prefer enum types to readResolve
- Item90: 考虑以序列化代理代替序列化实例 Consider serialization proxies instead of serialized instances