Java
文章平均质量分 76
为本人Java学习笔记,后续不断更新。
Cosmoshhhyyy
悲观者正确 乐观者前行 打怪升级ing 公众号《码宇行空》
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《Effective Java》解读第31条:利用有限制通配符来提升API的灵活性
在API中使用通配符类型(? extends 和 ? super)可以使参数类型更加灵活,同时保持类型安全。 这是实现"PECS"原则(Producer-Extends, Consumer-Super)的关键技术。原创 2026-01-03 01:29:16 · 466 阅读 · 0 评论 -
《Effective Java》解读第30条:优先考虑泛型方法
类可以是泛型的(如List),方法也可以是独立的泛型方法。泛型方法意味着该方法可以独立于其所在类,拥有自己的类型参数,从而在更广泛的输入类型上安全地工作。原创 2026-01-02 19:27:39 · 172 阅读 · 0 评论 -
《Effective Java》解读第29条:优先考虑泛型
Java泛型是增强代码类型安全性和可读性的核心工具。不使用泛型的代码会产生大量运行时强制转换,既不安全也容易出错。原创 2026-01-01 23:00:55 · 350 阅读 · 0 评论 -
《Effective Java》解读第27条:消除非受检的警告
本文强调应尽可能消除所有编译器非受检警告,确保代码类型安全。建议优先通过修改代码(如使用菱形操作符)消除警告,若无法消除但确定代码安全,可使@SuppressWarnings("unchecked")注解,并添加注释说明原因。注解应限制在最小作用范围,避免掩盖重要警告。文中提供了常见警告类型及示例代码,展示了如何在保证安全性的前提下合理抑制警告。原创 2025-12-17 16:39:29 · 189 阅读 · 0 评论 -
《Effective Java》解读第26条:请不要使用原生态类型
避免使用原生态类型(raw type),优先使用泛型(generic type)。原创 2025-12-17 15:25:38 · 396 阅读 · 0 评论 -
《Effective Java》解读第25条:限制源文件为单个顶级类
摘要: Java源文件应遵循"一个文件一个顶级类"原则,文件名与公共类名保持一致。该规则提升代码清晰度、可维护性和构建可靠性: 便于快速定位和理解代码结构 避免重构时产生副作用 防止编译顺序导致的不可预测行为 消除命名空间混乱风险 例外情况仅限紧密关联的辅助类或测试代码,但更推荐使用静态嵌套类。主流IDE默认支持此规范,违反规则带来的微小便利远不及潜在风险,应作为强制纪律遵守。原创 2025-12-03 16:49:48 · 883 阅读 · 0 评论 -
《Effective Java》解读第23条:类层次优于标签类
本文阐述了标签类的弊端及重构为类层次的方法。标签类通过枚举字段区分类型,导致代码臃肿、内存浪费且违反设计原则。重构步骤包括:抽取抽象根类、创建具体子类、迁移字段方法、用多态替代条件判断。类层次结构具有类型安全、易扩展等优势,符合单一职责和开闭原则。通过几何形状示例展示了标签类与层次类的差异,强调类层次是更优的面向对象设计选择。原创 2025-12-03 16:04:13 · 375 阅读 · 0 评论 -
《Effective Java》解读第24条:静态成员类优于非静态成员类
本文介绍了Java中四种嵌套类的特性及适用场景。静态成员类是最常用的形式,无需绑定外围实例,适合Builder模式等场景;非静态成员类(内部类)隐式持有外围实例引用,适合迭代器等需要访问外围实例成员的场景;匿名类用于一次性实现接口或抽象类,Java 8后可用Lambda替代;局部类则定义在方法内部,使用最少。建议优先使用静态成员类,除非需要访问外围实例才使用非静态成员类,以减少不必要的内存消耗。合理选择嵌套类类型有助于优化代码结构和性能。原创 2025-12-02 14:04:20 · 843 阅读 · 0 评论 -
《Effective Java》解读第22条:接口只用于定义类型
接口应仅用于定义类型行为,而非承载常量。常量接口存在破坏封装性、污染命名空间等问题。推荐使用工具类(私有构造器+静态常量)、枚举或嵌套类组织常量。工具类示例: public final class PhysicalConstants { private PhysicalConstants() {} public static final double AVOGADROS_NUMBER = 6.022e23; } 嵌套类可增强分类(如ErrorCodes.Http.OK)。避免接口常量。原创 2025-12-01 15:14:36 · 595 阅读 · 0 评论 -
《Effective Java》解读第21条:为后代设计接口
摘要: 接口设计需具备前瞻性,因其发布后难以修改。Java 8的默认方法虽缓解了接口演进的兼容性问题,但需谨慎使用:应作为后期修正工具而非初始设计手段,避免多重继承冲突。核心建议包括:优先通过抽象骨架类(如AbstractList)提供基础实现,减少实现负担;默认方法需确保安全、高效且逻辑合理;设计时假设接口不可更改,严格规划方法。最终目标是构建稳定且可扩展的接口,平衡灵活性与兼容性。原创 2025-12-01 11:37:36 · 994 阅读 · 0 评论 -
《Effective Java》解读第20条:接口优于抽象类
摘要: 本文探讨了接口优于抽象类的设计原则。接口提供了更灵活的多态实现方式,允许构建非层级结构类型框架和混合类型。通过示例展示了如何用抽象类定义共性特征,用接口定义行为。文章分析了接口的四大优势:易扩展性、非层级结构、混合类型支持和包装类模式。同时指出接口的局限性,如无法提供Object方法默认实现。解决方案是结合接口和骨架实现类(Abstract[InterfaceName]),既保留接口灵活性又共享实现代码。这种"接口+骨架类"模式是构建健壮、可扩展组件的有效方式。原创 2025-11-28 18:02:16 · 734 阅读 · 0 评论 -
《Effective Java》解读第19条:要么设计继承并提供文档说明,要么禁止继承
摘要: 继承是强大但危险的机制,除非类专门为继承设计,否则应禁止继承。为继承设计的类需详细文档说明可重写方法的影响,提供protected方法供安全重写,并避免在构造器、clone和readObject中调用可重写方法。禁止继承的两种方式:声明类为final,或将构造器设为private/package-private并通过静态工厂提供实例。由于为继承设计需要大量工作且限制多,大多数普通类应禁止继承以保证安全。(149字)原创 2025-11-28 16:35:11 · 197 阅读 · 0 评论 -
《Effective Java》解读第18条:复合优先于继承
本文探讨了面向对象设计中复合优先于继承的原则。继承在跨包使用时存在风险,会破坏封装性(子类依赖父类实现细节)、可能破坏子类(父类更新导致冲突)、且并非所有情况都符合"is-a"关系。复合通过在新类中持有现有类的实例并转发方法调用,提供了更安全的复用方式。虽然复合存在"丢失身份"引用和轻微性能开销等缺点,但在大多数情况下仍是更好的选择。只有当子类真正是父类的子类型且愿意继承父类所有API缺陷时,才应考虑使用继承。原创 2025-11-28 14:45:00 · 564 阅读 · 0 评论 -
《Effective Java》解读第17条:使可变性最小化
摘要:文章探讨了不可变类的概念与实现方法。不可变类指实例化后状态不可修改的类,如String和基本包装类。实现要点包括:不提供修改方法、定义final类、声明final私有字段、防御性拷贝可变组件。优点包括线程安全、对象共享、构建其他对象等,缺点是每个不同值需单独对象。解决方案是提供可变配套类(如StringBuilder)。建议优先选择不可变类,必要时限制可变性,字段尽量设为private final。实际项目中虽少用final定义不可变类,但final常量很常见。原创 2025-11-27 15:19:48 · 241 阅读 · 0 评论 -
《Effectice Java》解读第16条:要在公有类而非公有域中使用访问方法
摘要: 面向对象编程强调封装性,直接暴露公有类的数据字段会破坏这一原则。公有字段导致失去对数据访问的控制,无法维护内部状态约束(不变式),且难以在修改时触发辅助操作或适应未来需求变化。应使用getter和setter方法封装字段,以保持灵活性并增强可控性。例外情况包括包级私有类、私有嵌套类以及公有不可变常量(如public static final),但即使对不可变字段,仍建议通过方法访问以保留演化空间。核心准则:始终通过访问方法封装公有类的可变状态。原创 2025-11-26 15:40:54 · 442 阅读 · 0 评论 -
《Effective Java》解读第15条:使类和成员的可访问性最小化
本文阐述了软件设计中"使类和成员可访问性最小化"的核心原则。建议从最严格的private访问级别开始,仅在必要时逐步放宽至package-private、protected或public。重点包括:1)顶层类应优先设为包级私有;2)实例字段决不应设为public;3)公有静态final常量需确保不可变性;4)Java9模块系统提供额外保护。这种最小化访问控制的做法能有效实现信息隐藏,带来解耦、可维护性提升、性能优化和并行开发等优势。通过严格封装内部实现细节,仅暴露必要API,可以构建更健原创 2025-11-20 16:09:43 · 358 阅读 · 0 评论 -
《Effective Java》解读第14条:考虑实现Comparable接口
摘要: 实现Comparable接口可为类定义自然排序,支持泛型算法和有序集合。compareTo方法需满足自反性、对称性、传递性和一致性(建议与equals结果一致)。最佳实践:优先使用包装类的compare方法或Java 8+的Comparator构建方法(如comparingInt、thenComparingInt),避免直接相减导致的整数溢出,并按字段重要性分级比较。注意处理null值,并推荐将比较器声明为static final以避免重复创建。违反compareTo与equals一致性时需明确说明原创 2025-11-18 11:46:59 · 895 阅读 · 0 评论 -
《Effective Java》解读第13条:谨慎地覆盖clone
摘要:Java的clone方法存在诸多设计缺陷,不推荐直接使用。主要问题包括:语义不明确(深/浅拷贝)、绕过构造器、Cloneable接口异常机制不合理、与final域冲突等。若必须实现clone,应遵循规范:实现Cloneable接口,调用super.clone()进行浅拷贝,并递归处理可变对象字段。更推荐的替代方案是使用拷贝构造器或静态工厂方法,它们更灵活安全,能避免clone的固有缺陷,尤其适合处理含引用类型字段的对象复制需求。原创 2025-11-14 18:06:34 · 425 阅读 · 0 评论 -
《Effective Java》解读第12条:始终要覆盖toString
覆盖toString方法能显著提升类的可用性,建议所有子类都实现这个方法。默认的Object.toString()仅返回类名和散列码,几乎无实用价值。好的toString应包含关键字段信息,格式清晰且文档化,便于调试和日志记录。实现方式包括手动拼接字符串、String.format()或使用IDE/Lombok等工具生成。注意事项:避免泄露敏感信息,性能敏感场景需优化,静态工具类等特殊情况可不覆盖。原创 2025-11-13 17:55:03 · 380 阅读 · 0 评论 -
《Effective Java》解读第11条:覆盖equals时总要覆盖hashCode
摘要:本文强调了覆盖equals方法时必须同时覆盖hashCode方法的重要性。根据Object规范,两个逻辑相等的对象必须产生相同的哈希码,否则在使用HashMap、HashSet等集合时会出现问题。文章通过示例说明了不覆盖hashCode导致的错误行为,并详细介绍了如何正确实现hashCode方法,包括使用31作为合并因子、处理不同字段类型等。最后指出可以使用Objects.hash()简化实现,以及需要注意缓存哈希值、不省略关键字段等细节,确保哈希方法的正确性和性能。原创 2025-11-12 10:04:31 · 608 阅读 · 0 评论 -
《Effective Java》解读第10条:覆盖equals时请遵守通用约定
本文介绍了覆盖equals方法时应遵循的通用约定。在大多数情况下无需重写equals,但当类需要"逻辑相等"概念(如值类)时则需要覆盖。覆盖时必须满足五个特性:自反性、对称性、传递性、一致性和非空性。实现高质量equals方法的技巧包括:使用==检查自引用、instanceof验证类型、逐字段比较等,同时要注意处理null值和特殊类型。最后强调覆盖equals时必须同时覆盖hashCode,避免过度设计,并建议使用IDE工具生成后测试。原创 2025-11-11 15:07:53 · 883 阅读 · 0 评论 -
《Effective Java》解读第9条:try-with-resources 优先于 try-finally
摘要:Java应优先使用try-with-resources替代try-finally进行资源管理。优势包括:1)代码更简洁,自动关闭资源无需finally块;2)异常处理更完善,不会覆盖原始异常;3)支持多资源自动按逆序关闭;4)所有实现AutoCloseable接口的资源均可使用。相比try-finally,try-with-resources能减少代码量、避免资源泄漏、保留完整异常链,仅在处理非AutoCloseable资源时才考虑传统方式(但极少需要)。原创 2025-11-06 19:45:00 · 298 阅读 · 0 评论 -
《Effective Java》解读第8条:避免使用终结方法和清除方法
摘要:应避免使用终结方法(Finalizer)和清除方法(Cleaner),因其存在不可靠、性能差等缺陷。终结方法可能导致资源未及时释放或异常被忽略;清除方法虽稍好但仍不可预测。正确做法是实现AutoCloseable接口,通过try-with-resources确保资源及时关闭。Java的垃圾回收机制以内存管理为主,不应依赖其处理关键资源释放。原创 2025-11-06 19:00:00 · 232 阅读 · 0 评论 -
《Effective Java》解读第7条:消除过期的对象引用
摘要: 本文探讨了Java中内存泄漏问题及其解决方案。尽管Java有自动垃圾回收机制,但程序若保留过期对象引用仍会导致内存泄漏。重点分析了三种典型场景:1)类自行管理内存时(如栈实现),需手动置null释放无效引用;2)缓存场景建议使用WeakHashMap或缓存库自动清理;3)监听器需显式注销或使用弱引用。核心建议包括:警惕自管理内存的类、谨慎使用null、优先采用成熟工具库,并通过代码审查和静态分析预防泄漏。开发者应培养引用管理意识,而非过度依赖GC。原创 2025-11-04 20:30:00 · 654 阅读 · 0 评论 -
《Effective Java》解读第6条:避免创建不必要的对象
本文阐述了避免创建不必要对象的优化原则。核心思想是对功能相同的不可变对象应尽量重用,而非重复创建。示例包括:使用字符串字面量而非new String()、缓存昂贵的Pattern对象、警惕自动装箱导致的对象创建、优先使用静态工厂方法等。同时指出不应过度优化的情况:当对象创建成本低、或需要保护性拷贝保证安全性时,合理创建新对象是可接受的。特别强调,在需要防御性编程时,必须进行对象拷贝以确保不变性,此时不应重用对象。该原则能有效提升性能、减少内存占用和GC压力。原创 2025-11-04 11:59:36 · 298 阅读 · 0 评论 -
《Effective Java》解读第5条:优先考虑依赖注入来引用资源
摘要:本文探讨了依赖注入(DI)在Java开发中的重要性。通过对比静态工具类和单例模式,指出它们依赖硬编码、缺乏灵活性的缺陷。推荐使用依赖注入模式,通过构造函数或setter方法从外部注入依赖,从而提高代码的灵活性、可测试性和松耦合性。文章详细介绍了Spring Boot中三种依赖注入方式(构造器注入、setter注入和字段注入)及其优缺点,建议在大型项目中使用DI框架(如Spring)管理复杂依赖关系。依赖注入是现代Java开发中实现高质量代码的关键实践。原创 2025-10-31 16:55:44 · 569 阅读 · 0 评论 -
Effective Java第4条:通过私有构造器强化不可实例化的能力(精简与解析)
本文阐述了如何通过私有构造器确保工具类不可实例化的最佳实践。对于仅包含静态方法和字段的工具类(如StringUtils、MathUtils等),应显式添加私有构造器并抛出AssertionError,这既防止了编译器生成默认构造器,也避免了类的内部误调用构造器。该方法比抽象类更有效,同时会阻止类的子类化(子类无法访问父类私有构造器),是确保工具类纯粹性的推荐做法。原创 2025-10-27 16:53:11 · 232 阅读 · 0 评论 -
Effective Java解析与精简:用私有构造器或者枚举类型强化Singleton属性(第3条)
本文探讨了实现单例模式的多种方法。主要内容包括:1)通过私有构造器和静态final字段实现单例;2)使用静态工厂方法增强灵活性;3)推荐使用枚举类型实现单例,因其具有线程安全、防止反射攻击和自动处理序列化等优势。此外,文章还介绍了多线程环境下的单例实现方案,包括双重校验锁、静态内部类和即时初始化等方法。其中枚举方式最为推荐,能完美解决反射、序列化和线程安全问题,代码也最为简洁。其他方法各有优缺点,需要根据具体场景选择。原创 2025-10-27 15:07:07 · 381 阅读 · 0 评论 -
Effective Java解析与精简:遇到多个构造器参数时要考虑使用构建器(第2条)
文章摘要:本文介绍了三种处理多个构造器参数的方案。重叠构造方法通过层层调用来复用代码,但可读性较差;JavaBean模式使用setter方法赋值,清晰但可能导致状态不一致;建造者模式通过链式调用和必选/可选参数分离,既灵活又清晰,尤其适合复杂对象的构建。文中通过银行账户和披萨类的层次结构示例,展示了建造者模式在实际应用中的优势,包括代码可读性、参数灵活性和类型安全性。当构造参数较多时,建造者模式是最推荐的解决方案。原创 2025-10-22 18:16:31 · 260 阅读 · 0 评论 -
Effective Java解析与精简:用静态工厂方法代替构造器(第1条)
静态工厂方法替代构造器的优势包括:命名更灵活、可复用对象、返回子类型、根据参数返回不同对象以及支持服务提供者模式。常见命名约定如valueOf、of、getInstance等。缺点是不能继承无公开构造器的类且需记忆方法名。典型应用如Integer.valueOf()缓存对象、Collections工具类返回特殊List实现等。这种方式通过接口编程提高了灵活性和可维护性。原创 2025-10-21 17:15:24 · 885 阅读 · 0 评论 -
Jackson库中@JsonAlias和@JsonProperty的使用和区别
@JsonAlias为别名,说明原名称依然可以映射,同时别名也可以,相当于一对多,而@JsonProperty则单纯代表一对一映射关系。原创 2024-11-29 10:00:00 · 820 阅读 · 0 评论 -
Jackson库中JsonInclude的使用
JsonInclude是 Jackson 库(Java 中用于处理 JSON 数据的流行库)中的一个注解。它用于控制在序列化 Java 对象为 JSON 时,哪些属性应该被包含在 JSON 输出中。这个注解提供了多种策略来决定属性的包含与否,帮助减少不必要的数据传输,提高性能并且优化 JSON 数据的结构。原创 2024-11-26 19:08:47 · 1566 阅读 · 0 评论 -
一篇博客带你学会JUC并发编程(后端必会、五万字笔记)
包含并发编程各种知识,大量代码和样例,同时也有我个人自己的理解。原创 2024-06-06 00:06:05 · 1275 阅读 · 0 评论 -
一篇博客带你了解JVM(后端必会、七千字精简笔记)
本篇为个人jvm笔记,较为精简,适合已经学习过的人复习,包含场景垃圾回收算法,场景垃圾回收器等知识。原创 2024-05-08 17:12:03 · 1375 阅读 · 0 评论 -
Java:JDK如何创建动态代理Proxy
动态代理是Java编程语言中的一种特性,允许在运行时创建代理类和对象。它主要用于实现AOP(面向切面编程)和在运行时处理其他类的方法调用,例如远程方法调用(RPC)、事务管理等。原创 2024-04-10 16:38:17 · 416 阅读 · 0 评论 -
Java中128陷阱源码剖析(一看就懂)
主要解析java中integer类的经典128问题,逻辑清晰,通俗易懂,一看就会。原创 2024-03-26 01:40:41 · 1036 阅读 · 0 评论 -
Java:七万字java基础笔记(内含代码和样例)
本文为自己学习java时记录的万字笔记。原创 2024-03-10 23:48:43 · 1662 阅读 · 0 评论 -
Java:仿写一个简易的tomcat(步骤 + 详细代码)
本文介绍,如何用java实现一个简易的tomcat,主要学习反射和tomcat执行流程,了解TCP协议的传输,包含详细代码与注释。原创 2023-12-15 11:42:00 · 1042 阅读 · 0 评论 -
Java:TCP 通信方法(基本发送 + 接收)并 实现文件传输且反馈
本文包含,java的TCP编程的基本用法,并实现文件传输且反馈。原创 2023-12-12 14:46:25 · 3544 阅读 · 0 评论 -
Java:字符流 文件输出 与 读入 方法
本文章介绍java的io流中的字符流用法,包含代码。原创 2023-12-11 21:05:39 · 267 阅读 · 0 评论
分享