Java高效编程
文章平均质量分 88
蒙娜丽宁
华为HDE(HUAWEI Developer Experts),UnityMarvel创始人,开放原子基金会银牌讲师,51CTO学堂金牌讲师,IT畅销书作者。从事软件研究和开发超过20年,长期从事编译器、人工智能、Python、Go、JavaScript、Java及跨平台技术的研究和开发工作,曾出版超过40本IT图书。主要著作包括《Python从菜鸟到高手》、《Python爬虫从菜鸟到高手》、《奇妙的Python:神奇代码漫游之旅》。
展开
-
Java高效编程(18):优先使用组合而非继承
组合比继承更适合代码重用,特别是当类之间没有真正的“是一个”关系时。继承会导致子类依赖于父类的实现细节,增加维护复杂性,并使代码脆弱。通过组合,新类包含现有类的实例,调用并转发其方法,这种方式可以避免继承带来的脆弱性。组合不仅更加稳定和灵活,还允许重新定义API,隐藏父类的缺陷,使代码更易于维护和扩展。因此,除非子类和父类之间有明确的子类型关系,否则应优先选择组合而非继承。原创 2024-10-04 17:35:25 · 906 阅读 · 0 评论 -
Java高效编程(17):减少类的可变性以提高安全性和线程安全
不可变类在对象的生命周期内信息固定,具有易设计、少出错和线程安全等优点。遵循五个规则可实现不可变性:不提供变更器、不允许继承、字段设为final和private、对可变组件独占访问。不可变对象线程安全,易共享,适合用作静态常量和缓存实例。原创 2024-10-04 17:35:44 · 962 阅读 · 0 评论 -
Java高效编程(16):在公共类中使用访问器方法,而不是公共字段
在公共类中直接暴露字段是不推荐的,尤其是可变字段,因为这会影响封装、灵活性和安全性。建议使用私有字段并提供访问器和修改器方法,以便在不影响客户端代码的情况下进行维护和更改,确保代码的长期可维护性和安全性。原创 2024-10-04 17:36:18 · 717 阅读 · 0 评论 -
Java高效编程(15):最小化类与成员的可见性
在软件设计中,信息隐藏和封装是关键原则。通过尽可能减少类与成员的可见性,我们可以提高代码的安全性、可维护性和可重用性,降低组件之间的耦合度,从而减少系统开发和维护的风险。原创 2024-10-04 13:30:43 · 1077 阅读 · 0 评论 -
Java高效编程(15):尽量减少类和成员的可访问性
为了确保组件设计的质量,应尽量减少类和成员的可访问性。通过信息隐藏和封装,可以使系统的不同部分独立开发和维护,并降低耦合度。Java 的访问控制机制(`private`、`package-private`、`protected`、`public`)提供了多种访问级别,确保类和成员的访问权限与其功能一致。在设计时应优先考虑 `private`,只有在必要时再逐步提升访问权限。这不仅提高了代码的灵活性和安全性,也有助于性能优化和代码重用。原创 2024-10-04 10:00:00 · 684 阅读 · 0 评论 -
Java高效编程(14):考虑实现 Comparable
`Comparable` 接口定义了 `compareTo` 方法,用于实现类的自然排序。通过实现 `Comparable`,一个类的实例可以轻松排序、搜索和比较。实现 `compareTo` 时需遵循等价性、对称性和传递性原则,同时确保排序与 `equals` 一致性。为了避免冗长和错误,建议使用 Java 的比较器构建方法(如 `Comparator.comparingInt`)或静态比较方法,而非 `` 操作符。实现合理排序的值类应始终实现 `Comparable` 接口,原创 2024-10-04 10:00:00 · 1517 阅读 · 0 评论 -
Java高效编程(13):谨慎重写 `clone` 方法
条目13:谨慎重写 clone 方法Cloneable 接口最初设计为一个混合接口,用于表示类支持克隆操作。然而,它未能有效实现这一目标。其主要缺陷在于没有定义 clone 方法,而 Object 的 clone 方法是受保护的。因此,无法仅因为某对象实现了 Cloneable 就调用它的 clone 方法,除非使用反射,即便如此也可能失败。此外,克隆对象的机制有很多问题,包括未调用构造函数就创建对象,这使得克隆机制复杂且危险。Cloneable 接口唯一的作用是影响 Object 中 clone原创 2024-10-03 10:00:00 · 897 阅读 · 0 评论 -
Java高效编程(12):重写toString方法
重写 toString 方法有助于提高类的可用性和调试性。toString 应提供对象的简洁且信息丰富的描述,特别是在值类中。指定格式虽然提供了明确的表示,但可能限制将来对格式的修改,因此应慎重选择。无论如何,应为对象提供访问器,以避免将字符串表示视为 API。自动生成的 toString 方法优于继承自 Object 的默认实现。原创 2024-10-03 10:00:00 · 842 阅读 · 0 评论 -
Java高效编程(11):重写equals时必须同时重写hashCode
每次重写 `equals` 方法时,都必须同时重写 `hashCode` 方法,以确保类在哈希表等数据结构中正确工作。`hashCode` 方法必须遵循合同,确保相等的对象具有相同的哈希值,而不相等的对象尽量具有不同的哈希值。编写 `hashCode` 时,可以使用常见的算法,通过乘法和加法组合字段的哈希值,并可以在某些情况下缓存计算结果以提升性能。原创 2024-10-02 10:00:00 · 756 阅读 · 0 评论 -
Java高效编程(10):重写equals时必须遵循通用约定
重写 `equals` 方法时,必须遵循合同的五个规定:自反性、对称性、传递性、一致性和非空性。违反这些规定会导致程序行为异常,难以调试。编写 `equals` 时,应比较类的所有重要字段,并使用适当的类型检查。避免过度复杂化,使用组合而非继承是解决复杂值比较问题的有效途径。原创 2024-09-28 20:04:47 · 842 阅读 · 0 评论 -
Java高效编程(9):优先使用 try-with-resources 而非 try-finally
在 Java 中,管理必须手动关闭的资源(如文件、数据库连接等)时,推荐使用 `try-with-resources` 语句替代传统的 `try-finally` 语句。`try-with-resources` 代码更简洁,且提供了更好的异常处理机制,可以优雅地处理多个资源和异常。相比之下,`try-finally` 不仅冗长,而且容易抛弃原始异常。使用 `try-with-resources` 可以确保资源被正确关闭,并有效提高代码的可读性和维护性。原创 2024-10-02 10:00:00 · 770 阅读 · 0 评论 -
Java高效编程(8):避免使用终结器和清理器
终结器和清理器在Java中是不可预测的,通常会导致性能下降和潜在的安全问题。推荐使用 `AutoCloseable` 和 `try-with-resources` 代替终结器或清理器来管理资源。终结器和清理器应仅作为安全网或处理非关键资源的最后手段使用。使用清理器虽然相对更安全,但依然存在不确定性,可能导致资源迟迟无法释放。原创 2024-10-01 10:00:00 · 771 阅读 · 0 评论 -
Java高效编程(7):消除过时的对象引用
即使在垃圾回收语言中,如 Java,程序员依然需要关注内存管理,避免内存泄漏。当类管理自己的内存时,及时清理过时的对象引用非常重要。常见的内存泄漏来源包括栈、缓存和回调,解决方案包括使用弱引用、定期清理缓存以及缩小变量的作用域。内存泄漏可能导致性能下降,甚至程序崩溃,因此程序员应主动识别和预防这些问题。原创 2024-10-01 10:00:00 · 1519 阅读 · 0 评论 -
Java高效编程(6):避免创建不必要的对象
避免不必要的对象创建可以提高性能,尤其是对于不可变对象或昂贵对象,应尽量复用已有实例。依赖自动装箱和频繁使用构造函数可能导致隐性的性能开销,尤其是在高频场景中。手动管理对象池通常不是一个好的选择,除非对象非常重量级。现代 JVM 的垃圾回收机制已高度优化,因此对于轻量级对象,适当创建以提升代码可读性是合理的。原创 2024-09-30 10:00:00 · 986 阅读 · 0 评论 -
Java高效编程(5):优先使用依赖注入而非硬编码资源
依赖注入是一种将资源传递给类构造函数的设计模式,避免了静态工具类和单例类硬编码资源的局限性。通过依赖注入,可以灵活替换类所依赖的底层资源(如词典),提高了代码的可重用性和可测试性。工厂模式与 `Supplier` 接口结合使用,可以进一步增强灵活性。对于大型项目,使用依赖注入框架(如 Dagger、Guice、Spring)可以简化依赖管理,避免手动注入带来的混乱和复杂性。原创 2024-09-29 10:00:00 · 680 阅读 · 0 评论 -
Java高效编程(4):通过私有构造函数确保类无法被实例化
工具类通过私有构造函数防止被实例化,这是确保类不被错误使用的重要设计方法。若不定义构造函数,编译器会生成默认的无参构造函数,导致类可以被实例化。私有构造函数不仅防止实例化,还避免了类被继承。这种设计广泛应用于静态方法和常量的工具类,确保其只能作为方法集合使用,而不会被实例化或继承,保持类的完整性和用途明确。原创 2024-09-29 10:00:00 · 740 阅读 · 0 评论 -
Java高效编程(3):通过私有构造函数或枚举类型来确保单例属性
单例模式是一种保证类在整个应用程序中只实例化一次的设计模式。实现单例的三种主要方式包括:使用公共 `final` 字段、静态工厂方法和枚举。每种方式有不同的优缺点,公共字段实现简单直观,静态工厂方法提供更大的灵活性,而枚举则通过简洁的方式确保单例的同时避免序列化和反射攻击问题。根据具体需求,选择合适的实现方式可确保类的唯一性和安全性。原创 2024-09-28 18:18:35 · 802 阅读 · 0 评论 -
Java高效编程(2):面对多个构造参数时考虑使用构建器模式
在Java中,当类具有多个构造参数,尤其是可选参数较多时,传统的构造函数模式(逐层构造函数模式)会导致代码冗长且难以维护。以营养成分标签为例,常见的必需和可选参数组合使得构造函数数量激增。为解决这一问题,可以采用构建器模式,通过链式调用提供更清晰、可读性强的对象创建方式。构建器模式不仅简化了参数的管理,还提高了代码的可维护性和灵活性。原创 2024-09-26 12:54:11 · 420 阅读 · 0 评论 -
Java高效编程(1):使用静态工厂方法替代构造函数
在Java编程中,静态工厂方法提供了一种灵活且可读的创建对象方式,作为公共构造函数的替代。与构造函数不同,静态工厂方法可以具名,增强代码可读性,并能够返回不同类型的对象,甚至是其子类实例。此外,静态工厂方法支持多种创建逻辑,避免了构造函数参数过载的问题。通过这种方式,程序员可以更清晰地表达对象创建的意图,从而提升代码的可维护性和可理解性。原创 2024-09-26 12:50:24 · 944 阅读 · 0 评论