《Effective Java》知识点(1)--创建和销毁对象

1. 用静态工厂方法代替构造器,优点

1.1 它们有名称

1.2 不必在每次调用它们的时候都创建一个新对象

1.3 可以返回原返回类型的任何子类型的对象

1.4 所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值

1.5 方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在

2. 遇到多个构造器参数时要考虑使用构建器builder

如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式是不错的选择。

3. 用私有构造器或者枚举类型强化Singleton属性

3.1 public单例静态成员

3.2 public静态工厂方法,返回私有单例静态成员

3.3 推荐用单元素的枚举类型来实现Singleton,但如果Singleton必须扩展一个超类,而不是Enum时,则不宜使用这个方法

4. 通过私有构造器强化不可实例化的能力
5. 优先考虑依赖注入来引用资源

不要用Singleton和静态工具类来实现依赖一个或多个底层资源的类,应该将这些资源或者工厂传给构造器,通过它们来创建类,这个实践被称作依赖注入。

6. 避免创建不必要的对象

6.1 提高对象的复用能力

java 复制代码
String s = new String("hello");//don't do this
String s = "hello";//do this

6.2 优先使用基本类型而不是装箱基本类型,要当心无意识的装箱

如优先使用long , 而不是Long!

7. 消除过期的对象引用

所谓过期的引用,是指永远也不会再被解除的引用。

7.1 只要类是自己管理内存,就应该警惕内存泄漏问题。给对象引用赋null。

7.2 内存泄漏的另一来源是缓存。后台线程来清理。

7.3 内存泄漏第三个来源是监听器和其它回调。保存弱引用,如存成WeakHashMap中的键。

8. 避免使用终结方法和消除方法

缺点:

8.1 不确定性

a. 终结方法(finalizer)通常是不可预测的,也是危险的,一般情况下是不必要的。Java9中清除方法(cleaner)没有那么危险,但仍然是不可预测,运行缓慢,一般情况下也是不必要的。

b. 注重时间的任务不应该由终结方法和清除方法来完成,因为它们不能保证被及时执行。

c.永远不应该依赖终结方法或者清除方法来更新重要的持久状态。

8.2 非常严重的性能损失

8.3 严重的安全问题

恶意子类的终结方法,可以将对象的引用记录在一个静态域中,阻止它被垃圾回收。

两种合法用途:

a. 当资源的所有者忘记调用它的close方法时,终结方法可以充当"安全网"。

b. 清除本地非Java对象(native object)。

9. try-with-resources优先于try-finally

使用try-with-resources必须先实现AutoCloseable接口。它得到的代码更加简洁、清晰,产生的异常也更有价值。

相关推荐
yaoxin5211231 天前
279. Java Stream API - Stream 拼接的两种方式:concat() vs flatMap()
java·开发语言
@小码农1 天前
202512 电子学会 Scratch图形化编程等级考试三级真题(附答案)
服务器·开发语言·数据结构·数据库·算法
坚持学习前端日记1 天前
2025年的个人和学习年度总结以及未来期望
java·学习·程序人生·职场和发展·创业创新
Cosmoshhhyyy1 天前
《Effective Java》解读第29条:优先考虑泛型
java·开发语言
一路往蓝-Anbo1 天前
C语言从句柄到对象 (六) —— 继承与 HAL:父类指针访问子类数据
c语言·开发语言·stm32·嵌入式硬件·物联网
北冥有一鲲1 天前
A2A协议与LangChain.js实战:构建微型软件工厂
开发语言·javascript·langchain
Chen不旧1 天前
java基于reentrantlock/condition/queue实现阻塞队列
java·开发语言·signal·reentrantlock·await·condition
laplace01231 天前
Part 3:模型调用、记忆管理与工具调用流程(LangChain 1.0)笔记(Markdown)
开发语言·人工智能·笔记·python·langchain·prompt
寒水馨1 天前
com.github.oshi : oshi-core 中文文档(中英对照·API·接口·操作手册·全版本)以6.4.0为例,含Maven依赖、jar包、源码
java·后端
0和1的舞者1 天前
SpringBoot日志框架全解析
java·学习·springboot·日志·打印·lombok