JavaSE
文章平均质量分 92
Java基础:
1.Java基础内容
2.Java流程控制
3.Java方法
4.Java数组
5.Java面向对象OOP
6.Java异常
阿昌喜欢吃黄桃
这个作者很懒,什么都没留下…
展开
-
Day847.Immutability模式 -Java 并发编程实战
利用Immutability 模式解决并发问题,也许你觉得有点陌生,其实天天都在享受它的战果。Java 语言里面的 String 和 Long、Integer、Double 等基础类型的包装类都具备不可变性,这些对象的线程安全性都是靠不可变性来保证的。Immutability 模式是最简单的解决并发问题的方法,建议当你试图解决一个并发问题时,可以首先尝试一下 Immutability 模式,看是否能够快速解决。具备不变性的对象,只有一种状态,这个状态由对象内部所有的不变属性共同决定。原创 2023-01-02 15:00:15 · 698 阅读 · 0 评论 -
Day797.JVM内存模型 -Java 性能调优实战
JVM 在很大程度上减轻了 Java 开发人员投入到对象生命周期的管理精力。在使用对象的时候,JVM 会自动分配内存给对象,在不使用的时候,垃圾回收器会自动回收对象,释放占用的内存。但在某些情况下,正常的生命周期不是最优的选择,有些对象按照 JVM 默认的方式,创建成本会很高。比如,我在特定的场景使用 String.intern 可以很大程度地节约内存成本。可以使用不同的引用类型,改变一个对象的正常生命周期,从而提高 JVM 的回收效率,这也是 JVM 性能调优的一种方式。原创 2022-11-11 20:55:49 · 252 阅读 · 0 评论 -
Day796.什么是线程数据的强、弱一致性 -Java 性能调优实战
Hi,我是阿昌,今天学习记录的是关于。,其实在系统的很多地方都存在数据一致性的相关问题。除了在并发编程中保证共享变量数据的一致性之外,还有数据库的ACID中的 C(Consistency 一致性)、分布式系统的CAP理论中的 C(Consistency 一致性)。下面主要讨论的就是“”。在并发编程中,Java 是通过共享内存来实现共享变量操作的,所以在多线程编程中就会涉及到数据一致性的问题。原创 2022-11-10 21:26:41 · 610 阅读 · 0 评论 -
Day789.使用乐观锁优化并行操作 -Java 性能调优实战
乐观锁,顾名思义,就是说在操作共享资源时,它总是抱着乐观的态度进行,它认为自己可以成功地完成操作。但实际上,当多个线程同时操作一个共享资源时,只有一个线程会成功,那么失败的线程呢?它们不会像悲观锁一样在操作系统中挂起,而仅仅是返回,并且系统允许失败的线程重试,也允许自动放弃退出操作。乐观锁相比悲观锁来说,不会带来死锁、饥饿等活性故障问题,线程间的相互影响也远远比悲观锁要小。更为重要的是,乐观锁没有因竞争造成的系统开销,所以在性能上也是更胜一筹。原创 2022-11-03 21:29:52 · 240 阅读 · 0 评论 -
Day788.Lock同步锁的优化方法 -Java 性能调优实战
不管使用 Synchronized 同步锁还是 Lock 同步锁,只要存在锁竞争就会产生线程阻塞,从而导致线程之间的频繁切换,最终增加性能消耗。因此,如何降低锁竞争,就成为了优化锁的关键。在 Synchronized 同步锁中,我们了解了可以通过减小锁粒度、减少锁占用时间来降低锁的竞争。可以利用 Lock 锁的灵活性,通过锁分离的方式来降低锁竞争。原创 2022-11-02 20:46:23 · 292 阅读 · 0 评论 -
Day787.Synchronized同步锁的优化方法 -Java 性能调优实战
JVM 在 JDK1.6 中引入了分级锁机制来优化 Synchronized,当一个线程获取锁时。首先对象锁将成为一个偏向锁,这样做是为了优化同一线程重复获取导致的用户态与内核态的切换问题;其次如果有多个线程竞争锁资源,锁将会升级为轻量级锁,它适用于在短时间内持有锁,且分锁有交替切换的场景;轻量级锁还使用了自旋锁来避免线程用户态与内核态的频繁切换,大大地提高了系统性能;但如果锁竞争太激烈了,那么同步锁将会升级为重量级锁。减少锁竞争,是优化 Synchronized 同步锁的关键。原创 2022-11-01 20:12:15 · 455 阅读 · 0 评论 -
Day785.网络通信优化之通信协议:如何优化RPC网络通信 -Java 性能调优实战
一提到 RPC,是否还想到 MVC、SOA 这些概念呢?如果没有经历过这些架构的演变,这些概念就很容易混淆。架构的演变史:无论是微服务、SOA、还是 RPC 架构,它们都是分布式服务架构,都需要实现服务之间的互相通信,我们通常把这种通信统称为RPC 通信。,即远程服务调用,是通过网络请求远程计算机程序服务的通信技术。RPC 框架封装好了底层网络通信、序列化等技术,我们只需要在项目中引入各个服务的接口包,就可以实现在代码中调用 RPC 服务同调用本地方法一样。原创 2022-10-30 15:24:24 · 409 阅读 · 0 评论 -
Day784.网络通信优化之序列化:避免使用Java序列化 -Java 性能调优实战
无论是网路传输还是磁盘持久化数据,都需要将数据编码成字节码,而平时在程序中使用的数据都是基于内存的数据类型或者对象,需要通过编码将这些数据转化成二进制字节流;如果需要接收或者再使用时,又需要通过解码将二进制字节流转换成内存数据。我们通常将这两个过程称为序列化与反序列化。Java 默认的序列化是通过 Serializable 接口实现的,只要类实现了该接口,同时生成一个默认的版本号,无需手动设置,该类就会自动实现序列化与反序列化。原创 2022-10-29 11:51:12 · 306 阅读 · 0 评论 -
Day783.网络通信优化之I/O模型:如何解决高并发下I/O瓶颈 -Java 性能调优实战
I/O是机器获取和交换信息的主要渠道,而流是完成 I/O 操作的主要方式。在计算机中,流是一种信息的转换。流是有序的,因此相对于某一机器或者应用程序而言,通常把机器或者应用程序接收外界的信息称为输入流从机器或者应用程序向外输出的信息称为输出流(OutputStream),合称为输入 / 输出流(I/O Streams)。机器间或程序间在进行信息交换或者数据交换时,总是先将对象或数据转换为某种形式的流,再通过流的传输,到达指定机器或程序后,再将流转换为对象数据。因此,流就可以被看作是一种。原创 2022-10-28 20:15:58 · 1106 阅读 · 0 评论 -
Day782.HashMap的设计与优化 -Java 性能调优实战
HashMap 通过哈希表数据结构的形式来存储键值对,这种设计的好处就是查询键值对的效率高。在使用 HashMap 时,可以结合自己的场景来设置初始容量和加载因子两个参数。当查询操作较为频繁时,可以适当地减少加载因子;如果对内存利用率要求比较高,可以适当的增加加载因子。可以在预知存储数据量的情况下,提前设置初始容量(初始容量 = 预知数据量 / 加载因子)。这样做的好处是可以减少 resize() 操作,提高 HashMap 的效率。原创 2022-10-27 20:59:50 · 313 阅读 · 0 评论 -
Day781.Stream如何提高遍历集合效率 -Java 性能调优实战
现在很多大数据量系统中都存在分表分库的情况。例如,电商系统中的订单表,常常使用用户 ID 的 Hash 值来实现分表分库,这样是为了减少单个表的数据量,优化用户查询订单的速度。但在后台管理员审核订单时,需要将各个数据源的数据查询到应用层之后进行合并操作。例如,当需要查询出过滤条件下的所有订单,并按照订单的某个条件进行排序,单个数据源查询出来的数据是可以按照某个条件进行排序的,但多个数据源查询出来已经排序好的数据,并不代表合并后是正确的排序,所以我们需要在应用层对合并数据集合重新进行排序。在。原创 2022-10-26 20:18:41 · 357 阅读 · 0 评论 -
Day779.经典ArrayList与LinkedList -Java 性能调优实战
了解了 ArrayList 和 LinkedList 的实现原理以及各自的特点。如果能充分理解这些内容,很多实际应用中的相关性能问题也就迎刃而解了。就像如果现在还有人跟你说,“ArrayList 和 LinkedList 在新增、删除元素时,LinkedList 的效率要高于 ArrayList,而在遍历的时候,ArrayList 的效率要高于 LinkedList”,还会表示赞同吗?原创 2022-10-24 22:52:48 · 347 阅读 · 0 评论 -
Day778.正则表达式问题 -Java 性能调优实战
正则表达式是计算机科学的一个概念,很多语言都实现了它。正则表达式使用一些特定的元字符来检索、匹配以及替换符合规则的字符串。构造正则表达式语法的元字符,由普通字符、标准字符、限定字符(量词)、定位字符(边界字符)组成。正则表达式虽然小,却有着强大的匹配功能。经常用到它,比如,注册页面手机号或邮箱的校验。但很多时候,又会因为它小而忽略它的使用规则,测试用例中又没有覆盖到一些特殊用例,不乏上线就中招的情况发生。原创 2022-10-23 17:06:02 · 437 阅读 · 0 评论 -
Day777.字符串性能优化 -Java 性能调优实战
做好 String 字符串性能优化,可以提高系统的整体性能。在这个理论基础上,Java 版本在迭代中通过不断地更改成员变量,节约内存空间,对 String 对象进行优化。还特别提到了String 对象的不可变性,正是这个特性实现了字符串常量池,通过减少同一个值的字符串对象的重复创建,进一步节约内存。但也是因为这个特性,在做长字符串拼接时,需要显示使用 StringBuilder,以提高字符串的拼接性能。最后,在优化方面,还可以使用intern 方法。原创 2022-10-22 15:09:30 · 315 阅读 · 0 评论 -
Day726.Java平台模块系统 -Java8后最重要新特性
讨论了怎么使用 Java 模块封装我们的代码,了解了 module-info.java 文件以及它的结构和关键字。总体来看,Java 模块的使用是简单、直观的。Java 模块的使用,实现了更好的封装,也定义了模块和 Java 包之间的依赖关系。有了依赖关系,Java 语言就能够实现更快的类检索和类加载了。这样的性能提升,通过模块化就能实现,还不需要更改代码。如果面试的时候,讨论到了 Java 平台模块系统,可以聊一聊 Java 模块封装的关键字,以及这些关键字能够起到的作用。原创 2022-09-01 22:45:31 · 561 阅读 · 0 评论 -
Day725.Java为何需要模块化 -Java8后最重要新特性
讨论了 JDK 8 及其以前版本的访问控制缺陷,以及由此带来的种种问题。总体来说,Java 语言没有描述和定义包之间的依赖关系。这个缺失,导致了无法有效地封闭实现的细节;无法有效地管理应用的部署;无法精准地控制类的检索和加载,也影响了应用启动的效率。那能不能在 Java 语言里添加进来这个缺失的关系呢?该怎么做?这是下一次要讨论的话题。如果面试的时候,讨论到了Java 的访问修饰符,你不妨聊一聊这个缺失的环节,以及Jar 地狱这样的问题。...原创 2022-08-31 21:50:36 · 606 阅读 · 0 评论 -
Day724. 如何改进代码废弃 -Java8后最重要新特性
要管理好废弃的接口。接口的废弃要遵守程序,有序推进;代码的迁移要做好计划,尽快完成。另外,要使用好jdeprscan这个新的工具。在使用一个类库之前,要有意识地进行废弃依赖关系检查,提前做好代码风险的评估。如果面试中聊到了接口废弃的问题,可以聊一聊接口废弃的三部曲,以及每一步应该使用的 Java 注解形式。...原创 2022-08-30 21:45:28 · 625 阅读 · 0 评论 -
Day723. 现代密码 -Java8后最重要新特性
任何一个密码学的算法,都有它的生命周期。所以,要能够管理它们的生命周期。反映到代码里,就是要使用前向保密的安全协议以及当前推荐的算法;及时替换掉过期的算法。对于 JDK 的开发者来说,要关注JDK 的密码路线图,了解 JDK 根据密码学的进展作出的变动,及时解决代码里的兼容性问题。...原创 2022-08-29 22:06:06 · 469 阅读 · 0 评论 -
Day722. 空指针烦恼 -Java8后最重要新特性
在代码里,尽量不要产生空指针。没有空指针,也就没有了空指针的烦恼。如果避免不了空指针,我们就要看看能不能执行强制性的检查。通过使用空值去代替空指针通过@NotNull注解,只是告诉调用者我这个函数返回值可能是空通过Optional类,Optional 的价值不在于能避免空指针,更多的是一个强制性的提醒,让你去强制校验空指针。如果你去问一个开发为啥NPE了,得到的答案可能就是两个字: 忘了, 就这么直接。所以optional 是提醒你要去校验,而不是能替你解决。使用封闭类和模式匹配的组合形式。......原创 2022-08-28 20:24:58 · 466 阅读 · 1 评论 -
Day721. 外部函数接口 -Java8后最重要新特性
Java 的外部函数接口这个尚处于孵化阶段的新特性,对外部函数接口这个新特性有了一个初始的印象。外部内存接口和外部函数接口联系在一起,为我们提供了一个崭新的不同语言之间的协作方案。如果外部函数接口正式发布出来,我们可能需要考虑切换到外部函数接口,逐步退出传统的、基于 JNI 的解决方案。这一次学习的主要目的,就是让你对外部函数接口有一个基本的印象。由于外部函数接口尚处于孵化阶段,所以我们不需要学习它的 API。只要知道 Java 有这个发展方向,目前来说就足够了。...原创 2022-08-27 20:01:12 · 413 阅读 · 0 评论 -
Day720. 外部内存接口 -Java8后最重要新特性
讨论了 Java 的外部内存接口这个尚处于孵化阶段的新特性,对外部内存接口这个新特性有了一个初始的印象。设计外部内存接口的最初动力,是为了解决ByteBuffer的两个缺陷。也就是 ByteBuffer 占用的资源不能及时释放,以及它的寻址空间太小这两个问题。但是外部内存接口的更大使命,是和外部函数接口联系在一起的。如果外部内存接口正式发布出来,现在使用 ByteBuffer 的类库(比如 Flink 和 Netty,甚至 JDK 本身),应该可以考虑切换到外部内存接口来获取性能的提升。...原创 2022-08-26 23:04:57 · 399 阅读 · 0 评论 -
Day719. 矢量运算 -Java8后最重要新特性
Java 的矢量运算这个尚处于孵化阶段的新特性,对 Java 的矢量运算这个新特性有了一个初始的印象。如果 Java 矢量运算成熟起来,许多领域都可以从这个新特性中受益,包括但是不限于机器学习、线性代数、密码学、金融和 JDK 本身的代码。这一次学习的主要目的,就是让你对矢量运算有一个基本的印象。这样的话,如果代码里有大量的数值计算,也许可以考虑在将来使用矢量运算获得硬件的并行计算能力,大幅度提高代码的性能。...原创 2022-08-25 22:00:17 · 805 阅读 · 0 评论 -
Day718. 反应式编程 -Java8后最重要新特性
讨论了指令式编程模型和声明式编程模型,回调函数以及回调地狱,以及 Java 反应式编程模型的基本组件。了解指令式编程模型和声明式编程模型这两个术语;面试问题:你知道声明式编程模型吗,它是怎么工作的?了解 Java 反应式编程模型的基本组件,以及它们的组合方式;面试问题:你知道怎么使用 Java 反应式编程模型吗?知道回调函数的形式,以及回调地狱这个说法。面试问题:你知道回调函数有什么问题吗?反应式编程是目前主流的支持高并发的技术架构思路。原创 2022-08-24 22:30:16 · 522 阅读 · 0 评论 -
Day717. Java 的错误处理 -Java8后最重要新特性
可恢复异常不可恢复异常还给出了在使用错误码的场景下,快速定位问题的替代方案。了解可恢复异常和不可恢复异常这两个概念,以及它们的使用场景;面试问题:你的代码是怎么处理 Java 异常的?了解怎么在使用错误码的方案里,添加快速定位出问题的调试信息;面试问题:你的代码,是怎么定位可能存在的问题的?对 Java 错误处理机制的改进,这会是一个持续热门的话题。而能够了解替代方案,并且使用替代方案的软件工程师,现在还不多。原创 2022-08-23 22:17:18 · 255 阅读 · 0 评论 -
Day716. 抛出异常是一个合适的选择吗? -Java8后最重要新特性
了解了 Java 异常处理带来的性能问题,我还给你展示了使用错误码的方式进行错误处理的方案。使用错误码的方式进行错误处理,错误码不能携带调试信息,这提高了错误处理的性能,但是增加了错误排查的困难,降低了代码的可维护性。在代码里,是应该使用错误码,还是应该使用异常,这是一个需要根据应用场景认真权衡的问题。Java 的新特性,尤其是封闭类和档案类,为我们在 Java 的软件里使用错误码的形式,提供了强大的支持,让我们有了新的选择。原创 2022-08-22 21:50:47 · 482 阅读 · 1 评论 -
Day715. 适配不同的类型的switch匹配 -Java8后最重要新特性
具有模式匹配能力的 switch,提升了 switch 的数据类型匹配能力。switch 要匹配的数据,现在可以是整形的原始类型(数字、枚举、字符串),或者引用类型。在前面的讨论里,重点放在了 switch 表达式上。实际上,除了情景穷举相关的内容之外,我们的讨论也适用于 switch 语句。在我们日常的编码实践中,为了尽早暴露子类扩充出现的兼容性问题,降低代码的维护难度,提高多情景处理的性能,我们应该优先考虑使用 switch 的模式匹配,而不是传统的 if-else 语句。原创 2022-08-21 20:25:45 · 1396 阅读 · 0 评论 -
Day714. switch表达式 -Java8后最重要新特性
了解了 switch 表达式和改进的 switch 语句。讨论了 switch 表达式带来的新概念和新的关键字,了解了这些基本概念以及它们的适用范围。新的 switch 形式、语句和表达式,不同的使用范围,这些概念交织在一起,让 switch 的学习和使用都变成了一件有点挑战性的事情。箭头标识符的引入,简化了代码,提高了编码效率。可是,学习这么多种 switch 的表现形式,也增加了我们的学习负担。不同的 switch 表达形式,以及它们支持的特征,放在了下面这张表格里。原创 2022-08-20 15:16:15 · 1913 阅读 · 2 评论 -
Day713. 类型匹配:判断类型+强制转换合二为一 -Java8后最重要新特性
了解了 Java 的模式匹配和 Java 的类型匹配,讨论了 Java 类型匹配要解决的问题、表现的形式,以及匹配变量的作用域。顺便,我们还讨论了我们喜欢的类型匹配代码的组织方式。在我们日常的编码实践中,为了简化代码逻辑,减少代码错误,提高生产效率,我们应该优先考虑使用类型匹配,而不是传统的强制类型转换运算符。如果你想要丰富你的代码评审清单,有了 Java 类型匹配后,你可以加入下面这一条:如果需要类型转换,是不是可以使用类型匹配?原创 2022-08-19 22:09:21 · 890 阅读 · 1 评论 -
Day712. 封闭类-Java8后最重要新特性
使用私有类;使用 final 修饰符;使用 sealed 修饰符;不受限制的扩展性。在我们日常的接口设计和编码实践中,使用这四个限定方法的优先级应该是由高到低的。最优先使用私有类,尽量不要使用不受限制的扩展性。如果要丰富你的代码评审清单,有了封闭类后,你可以加入下面这一条:一个类,如果有真实的可扩展需求,能不能枚举,可不可以使用 sealed 修饰符?知道 Java 支持封闭类,并且能够使用封闭类编写代码;面试问题:你知道封闭类吗?会不会使用它?...原创 2022-08-18 22:55:53 · 838 阅读 · 0 评论 -
Day711. 档案类-Java8后最重要新特性
Java档案类是用来表示不可变数据的透明载体,用来简化不可变数据的表达,提高编码效率,降低编码错误。同时,我们也讨论了使用档案类的几个容易忽略的陷阱。在我们日常的接口设计和编码实践中,为了最大化的性能,我们应该优先考虑使用不可变的对象(数据);如果一个类是用来表述不可变的对象(数据),我们应该优先使用 Java 档案类。如果要丰富你的代码评审清单,有了封闭类后,你可以加入下面这一条:一个类,如果是用来表述不可变的数据,能不能使用 Java 档案类?技术要点。...原创 2022-08-17 22:05:14 · 368 阅读 · 0 评论 -
Day710.文字块-Java8后最重要新特性
了解了文字块的基本概念,它的表达形式以及编译的过程。文字块是 Java 语言中一种新的文字。字符串能够出现的任何地方,也都可以用文字块表示。但是,文字块提供了更好的表现力和更少的复杂性。文字块“所见即所得”的表现形式,使得使用复杂字符串的代码更加清晰,便于编辑,也便于阅读。这是一个能够降低代码错误,提高生产效率的改进。知道文字块的基本概念,以及文字块和字符串的关系;面试问题:你知道 Java 的文字块吗?它和字符串有什么区别?了解文字块要解决的问题,并且能够准确使用文字块;......原创 2022-08-16 22:04:30 · 890 阅读 · 0 评论 -
Day709.JShell -Java8后最重要新特性
JShell提供了一种在 JShell 状态下交互式评估 Java 编程语言的声明、语句和表达式的方法。JShell 的状态包括不断发展的代码和执行状态。为了便于快速调查和编码,语句和表达式不需要出现在方法中,变量和方法也不需要出现在类中。JShell 的设计并不是为了取代 IDE。JShell 在处理简单的小逻辑,验证简单的小问题时,比 IDE 更有效率。如果我们能够在有限的几行代码中,把要验证的问题表达清楚,JShell 就能够快速地给出计算的结果。这一点,能够极大地提高工作效率和学习热情。...原创 2022-08-15 21:41:58 · 522 阅读 · 0 评论 -
Day666.Java程序从虚拟机迁移到k8s的问题 -Java业务开发常见错误
Hello,这里是阿昌,今天学习记录的是关于的记录。使用 大规模部署应用程序,可以提升整体资源利用率,提高集群稳定性,还能提供快速的扩容能力,甚至还可以实现集群根据压力自动扩容。因此,现在越来越多的公司开始把程序从虚拟机(VM)迁移到 Kubernetes 了。在大多数的公司中,Kubernetes 集群由运维来搭建,而程序的发布一般也是由 平台完成。从虚拟机到 Kubernetes 的整个迁移过程,基本不需要修改任何代码,可能只是重新发布一次而已。所以,我们 Java 开发人员可能对迁移这个事情本身感原创 2022-07-03 15:09:06 · 1228 阅读 · 0 评论 -
Day660.定位排查应用问题 -Java业务开发常见错误
Hi,阿昌来也,今天是关于学习一些定位排查应用问题的学习记录。要说排查问题的思路,我们首先得明白是在什么环境排错。其实,排查问题就像在破案,生产环境出现问题时,因为要恢复应用,就不可能完整现场用于排查和测试。因此,是否有充足的信息可以了解过去、还原现场就成了破案的关键。这里说的信息,主要就是日志、监控和快照。日志就不用多说了,主要注意两点:对于,在生产环境排查问题时,首先就需要开发和运维团队做好充足的监控,而且是多个层次的监控。我们再来看看。这里的“快照”是指,应用进程在某一时刻的快照。通常情况下,我们会为原创 2022-06-27 22:32:39 · 430 阅读 · 1 评论 -
Day659.Stream API -Java业务开发常见错误
Hi,我是阿昌,今天记录学习的内容是针对JDK8中的新特性Stream 流式操作,用于对集合进行、、、等,更进一步地,这些操作能链式串联在一起使用,类似于 SQL 语句,可以大大简化代码。 的各种的一张图:先定义一个订单类、一个订单商品类和一个顾客类,用作后续 Demo 代码的数据结构:二、创建流要使用流,就要先创建流。创建流一般有五种方式:三、filter 方法可以实现过滤操作,类似 SQL 中的 where。我们可以使用一行代码,通过 filter 方法实现查询所有订单中最近半年金额大于原创 2022-06-26 17:15:33 · 754 阅读 · 1 评论 -
Day658.JDK8重要特性 -Java业务开发常见错误
Hi,我是阿昌,今天是记录学习关于 是目前最常用的 JDK 版本,在增强代码可读性、简化代码方面,相比 Java 7 增加了很多功能,比如 、操作、(ParallelStream)、、等。第一,从开始,先尝试把遍历 List 来筛选和转换数据的操作,使用 Stream 的 filter 和 map 实现,这是 Stream 最常用、最基本的两个 API。你可以重点看看接下来两节的内容来入门。第二,使用高级的来写代码,以此找到可以利用 Java 8 语言特性简化代码的地方。比如,对于 IDEA,我们可以把匿名原创 2022-06-25 20:38:03 · 587 阅读 · 1 评论 -
Day647.接口设计规范问题 -Java业务开发常见错误
Hi,我是阿昌,今天学习分享的是关于接口设计规范的一些小问题。在做接口设计时一定要确保系统之间对话的语言是统一的。在开发一个服务的第一步就是设计接口。接口的设计需要考虑的点非常多,比如接口的命名、参数列表、包装结构体、接口粒度、版本策略、幂等性实现、同步异步处理方式等。这其中,和接口设计相关比较重要的点有三个,分别是包装、、。案例:一个处理收单的收单中心项目,下单接口返回的响应体中,包含了 success、code、info、message 等属性,以及二级嵌套对象 data 结构体。在对项目进行重构的时.原创 2022-06-14 23:37:05 · 443 阅读 · 0 评论 -
Day646.代码重复问题 -Java业务开发常见错误
Hi,我是,我又来了!今天所学习分享记录的是针对重复代码消除的一些设计模式的解决方案方案。一个项目是大型项目成熟度的一个重要指标,而提升可维护性非常重要的一个手段就是减少代码重复。案例:假设要开发一个购物车下单的功能,针对不同用户进行不同处理:我们的目标是实现三种类型的购物车业务逻辑,把入参 Map 对象(Key 是商品 ID,Value 是商品数量),转换为出参购物车类型 Cart。先实现针对普通用户的购物车处理逻辑:然后实现针对 VIP 用户的购物车逻辑。与普通用户购物车逻辑的不同在于,VIP 用户能原创 2022-06-13 22:13:13 · 570 阅读 · 0 评论 -
Day645.思考题解答③ -Java业务开发常见错误
Hi,阿昌来也,今天记录学习的是针对学习文章的一些思考题答案。问题 1:在讲“为什么我的日志会重复记录?”的案例时,我们把 INFO 级别的日志存放到 _info.log 中,把 WARN 和 ERROR 级别的日志存放到 _error.log 中。如果现在要把 INFO 和 WARN 级别的日志存放到 _info.log 中,把 ERROR 日志存放到 _error.log 中,应该如何配置 Logback 呢?答:要实现这个配置有两种方式,分别是:直接使用 EvaluatorFilter 和自定义一个原创 2022-06-12 21:25:31 · 391 阅读 · 1 评论 -
Day642.反射、注解和泛型问题 -Java业务开发常见错误
Hi,我是,今天记录学习分享的是一些问题如果你从来没用过反射、注解和泛型,可以先通过官网有一个大概了解:的功能包括,。也就是说,针对类动态调用方法,不管类中字段和方法怎么变动,我们都可以用相同的规则来读取信息和执行方法。因此,几乎所有的 ORM(对象关系映射)、对象映射、MVC 框架都使用了反射。反射的起点是 Class 类,Class 类提供了各种方法帮我们查询它的信息。你可以通过这个文档,了解每一个方法的作用。举例:有两个叫 age 的方法,入参分别是基本类型 int 和包装类型 Integer。如果原创 2022-06-09 22:33:50 · 478 阅读 · 1 评论