当前位置: 首页 > article >正文

《Effective Java》学习笔记——第1部分 创建对象和销毁对象的最佳实践

文章目录

    • 第1部分 创建和销毁对象
      • 一、前言
      • 二、创建和销毁对象最佳实践内容
        • 1. 优先使用工厂方法而非直接使用构造器
        • 2. 避免创建不必要的对象
        • 3. 避免使用过多的构造器
        • 4. 避免使用原始类型(Raw Types)
        • 5. 避免创建对象的过度依赖
        • 6. 清理资源和关闭对象(显式地管理对象生命周期)
        • 7. 避免使用 finalize()` 方法
      • 三、小结


image-20250121160352402

第1部分 创建和销毁对象

一、前言

《Effective Java》共有多个章节,每个章节提供了若干条建议或最佳实践,整理了对应章节关键的实践内容,用于自己后续代码开发过程中,参考对照,自查代码习惯,从而提升输出的代码质量。

二、创建和销毁对象最佳实践内容

1. 优先使用工厂方法而非直接使用构造器
  • 原因:直接调用构造器来创建对象的方式灵活性较差,尤其是在构造过程中可能需要大量的复杂参数时,代码就会变得不易维护和阅读。
  • 工厂方法的好处:工厂方法能够提供更高的灵活性,可以在方法内部控制对象的创建过程,并且可以对对象的创建方式进行封装。
  • 示例
    // 使用构造器创建对象
    Date date = new Date(2025, 1, 21);
    
    // 使用工厂方法创建对象
    public static Date newInstance(int year, int month, int day) {
        return new Date(year, month, day);
    }
    
2. 避免创建不必要的对象
  • 原因:频繁的对象创建会消耗更多的内存和处理时间,因此尽量避免无谓的对象实例化。
  • 实践:例如,对于不可变的对象或常量,可以考虑使用单例模式、缓存技术或享元模式,来避免重复创建相同的对象。
  • 示例:使用静态常量替代重复创建相同的对象。
    // 不必要的对象创建
    String a = new String("Hello");
    
    // 更好的做法
    String b = "Hello";  // 直接使用字符串字面量
    
3. 避免使用过多的构造器
  • 原因:过多的构造器会增加类的复杂性,并导致 API 不易使用,尤其是当类的构造器参数很多时,调用者很难确定需要传入哪些参数。
  • 解决方法:使用 构建者模式(Builder Pattern) 来提供更清晰、更易于使用的构造方式。通过构建者模式,类的实例化变得更加灵活和可维护。
  • 示例:使用构建者模式
    public class NutritionFacts {
        private final int servings;
        private final int calories;
    
        public static class Builder {
            private final int servings;
            private int calories = 0;
    
            public Builder(int servings) {
                this.servings = servings;
            }
    
            public Builder calories(int val) {
                calories = val;
                return this;
            }
    
            public NutritionFacts build() {
                return new NutritionFacts(this);
            }
        }
    
        private NutritionFacts(Builder builder) {
            servings = builder.servings;
            calories = builder.calories;
        }
    }
    
4. 避免使用原始类型(Raw Types)
  • 原因:原始类型会导致类型安全问题,并且不符合泛型的设计原则,因此应该避免使用原始类型。
  • 实践:使用 Java 泛型来确保类型的安全性。
  • 示例:避免原始类型
    // 不安全的原始类型
    List list = new ArrayList();
    list.add("Hello");
    
    // 使用泛型
    List<String> list = new ArrayList<>();
    list.add("Hello");
    
5. 避免创建对象的过度依赖
  • 原因:频繁地创建对象会导致内存占用增加、垃圾回收压力增大,甚至会影响性能。
  • 实践:使用对象池、缓存等技术来重用对象,避免频繁的创建和销毁。
  • 示例
    // 使用对象池技术可以避免频繁的创建和销毁对象
    ObjectPool<Connection> pool = new ObjectPool<>(new ConnectionFactory());
    Connection conn = pool.borrowObject();
    
6. 清理资源和关闭对象(显式地管理对象生命周期)
  • 原因:如果对象占用系统资源(如数据库连接、文件句柄等),如果不手动关闭,会导致资源泄漏。
  • 实践:使用 try-with-resources 或显式调用 close() 方法来确保资源的正确释放。
  • 示例
    // 使用 try-with-resources 自动关闭资源
    try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
        // 处理文件
    } catch (IOException e) {
        e.printStackTrace();
    }
    
7. 避免使用 finalize()` 方法
  • 原因finalize() 方法是在对象被垃圾回收器回收前调用的,但它的不确定性和执行时机会导致不可靠的资源释放。
  • 实践:尽量避免使用 finalize(),而是使用 try-with-resources 或手动清理资源。
  • 示例
    // 不推荐使用 finalize() 方法来管理资源
    @Override
    protected void finalize() throws Throwable {
        try {
            // 资源清理代码
        } finally {
            super.finalize();
        }
    }
    

三、小结

在“创建和销毁对象”部分中,书中提出了许多关于如何高效、安全地创建和销毁对象的建议。使用工厂方法避免过度构造使用对象池清理资源等方式,能够帮助程序员编写出更加健壮、性能优越的 Java 程序。这些实践不仅有助于避免性能瓶颈,也使得代码更加清晰和易于维护。


http://www.kler.cn/a/513629.html

相关文章:

  • Redis使用基础
  • TCP如何保证安全可靠?
  • 我国的金融组织体系,还有各大金融机构的分类,金融行业的组织
  • 【Excel】【VBA】Reaction超限点筛选与散点图可视化
  • 【线性代数】基础版本的高斯消元法
  • Keil自动生成Bin文件(2)
  • 2024年度个人成长与技术洞察总结
  • Data Filtering Network 论文阅读和理解
  • C++ 智能指针(八股总结)
  • 【组件库】使用Vue2+AntV X6+ElementUI 实现拖拽配置自定义vue节点
  • Springboot sse 示例
  • (done) 并行计算学习 (Day1: 两个简单的 OpenMP 例子)
  • JavaWeb开发(十五)实战-生鲜后台管理系统(二)注册、登录、记住密码
  • 【C++】揭秘类与对象的内在机制(核心卷之深浅拷贝与拷贝构造函数的奥秘)
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(五)-数的三次方根、机器人跳跃问题、四平方和
  • Python 进阶 - Excel 基本操作
  • 智能系统的感知和决策
  • 第15篇:从入门到精通:Python标准库详解
  • LeetCode 热题 100_全排列(55_46_中等_C++)(递归(回溯))
  • 简识JVM私有内存区域栈、数据结构