自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 记一次代码不规范导致的低级bug

今天发现一个停留了比较久的低级bug,根本原因是忽略了基本类型变量有默认值。接口的入参BO中有个flag变量:public class queryBo { ... /** * 筛选条件 */ private boolean flag;}这个变量在mapper中有用到:where 1 = 1<if test="queryBo.flag == true"> and table.filed = 1 &lt

2022-03-09 09:44:50 149

原创 Effective Java--42 lambda表达式优于匿名类

Java8的新特性之一:lambda表达式在Java8中,添加了函数式接口、lambda表达式和方法引用,以便更容易地创建函数对象。同时Stream API也为处理数据序列提供支持。使用单一抽象方法的接口被用作函数类型。它们的实例被称作函数对象,而创建函数对象最常见的方法就是利用匿名类。匿名类匿名类是不能有名字的类,它们不能被引用,只能在创建时用New语句来声明它们。匿名类的声明是在编译时进行的,实例化在运行时进行,这意味着for循环中的一个new语句会创建相同匿名类的几个实例。匿名类的目的是在某

2021-08-11 17:01:07 126

原创 2021-08-11 后端获取userId用于业务的小tips

在项目中可能会遇到需要权限验证的需求,这个时候往往是后端获取当前登录用户ID而非前端传过来,所以在接口编写的过程中我们可能会在Service层业务逻辑处理的时候来获取,这个习惯是不建议的,因为其它服务可能需要来调用这个接口,这个时候可能导致获取不了这个值出现异常。...

2021-08-11 11:37:00 427

原创 BO类中对于金额字段的验证注解@Digits

@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字interger指定整数精度,fraction指定小数精度。例如:@Digits(integer = 10, fraction = 2, message = "moneyAmount")private BigDecimal moneyAmount;

2021-08-11 11:25:17 8083

原创 Effective Java--27 消除非检查警告

在编程过程中,可能会出现一些黄色波浪线的警告,这些警告一般都说明我们的代码需要修改优化,它们被称为检查警告。使用泛型编程时,会看到许多编译器警告:未经检查的强制转换警告,未经检查的方法调用警告,未经检查的参数化可变长度类型警告以及未经检查的转换警告。 你使用泛型获得的经验越多,获得的警告越少,但不要期望新编写的代码能够干净地编译。如果你不能消除警告,但你可以证明引发警告的代码是类型安全的,那么(并且只能这样)用 @SuppressWarnings("unchecked") 注解来抑制警告。 如果你在没

2021-08-10 17:41:59 84

原创 mysql中关于AUTO_INCREMENT的使用

今天执行建表SQL的时候报错了:java.sql.SQLSyntaxErrorException: Incorrect table definition; there can be only one auto column and it must be defined as a key原来一个表中只能有一个自增列,且该列必须是一个KEY,建议将其添加为一个唯一键。...

2021-08-09 17:37:58 96

原创 Validation框架的学习

如果项目中涉及到RPC的建议考虑在Service层上加验证注解,而且是加在接口层上的,如果不涉及可以加在Controller层上,但是个别Service层方法需要考虑到其它地方调用。框架提供的一些基础注解都是不包含null的验证的,有需要必须单独加@NotNull。分组验证在项目中也会使用的比较多。https://www.bilibili.com/video/BV1UE411t7BZ?from=search&seid=12576185322147692325 validation框架的常用

2021-08-04 15:01:08 91

原创 Effective Java---64通过接口引用对象

通过接口引用对象我们应该立马想到多态,这其实也是多态的一种,它的优点是灵活,但是缺点是这个引用变量不能调用接口中没有定义但在使用的构造器类中实现的方法,即类似多态中的父类对象不能调用子类独有的方法。灵活:这个其实很好理解,灵活的原因在于接口可以有多个实现类,不同的实现类可以对接口中的方法定义有不同的实现,例如List接口下的ArrayList和LinkedList,我们可以按照自己的需要进行更换,如果周围的代码有依赖List引用的对象,那么即使从ArrayList更换为LinkedList也只需要改变

2021-08-02 23:42:41 187

原创 Effective Java---28列表优于数组

Effective Java一书中给出了列表优于数组的两个原因:1、数组(Array)是协变的,而列表(List)支持泛型,是可变的。2、数组是具体化的,在运行时会知道并强化它们的元素类型;泛型是通过擦除来实现的,只在编译的时候强化类型信息,在运行时擦除。擦除就是使泛型可以与没有使用泛型的代码随意进行互用。...

2021-07-28 19:22:25 85

原创 Effective Java---77不要忽略异常

这条建议确实看上去是显而易见的,但是它却常常被违反,因而值得再次提出来。当 API 的设计者声明一个方法将抛出某个异常的时候,表示他们在提示开发人员一些东西。所以,请不要忽略它!要忽略一个异常非常容易,只需将方法调用通过 try 语句包围起来,并包含一个空的 catch 块:// Empty catch block ignores exception - Highly suspect!try { ...} catch ( SomeException e ) {}空的 catch 块会使

2021-07-27 19:59:11 54

原创 Effective Java---18 组合优于继承

继承继承是实现代码重用的有效方式,在继承关系中分为父类和子类两种角色,同包级别中子类在继承父类后可以访问父类的非private成员,拥有父类所有的非private成员;但是如果继承使用不当的时候可能会造成子类变得脆弱。实现继承此处涉及的继承是“实现继承”(一个类扩展另外一个类)而非“接口继承”,如果一个子类始终依靠父类提供的方法实现来保证正确的功能,然而父类的方法实现可能会随版本更新迭代,这种情况下子类就可能被破坏,所以子类必须随父类的更新一起变化,除非父类的设计者一开始就是为了继承,并对应有相关文档

2021-07-26 11:41:38 81

转载 Lombok注解-@SneakyThrows

突然想起之前看的一篇文章,涉及到异常处理的一个注解,却发现已经没有记忆了,所以赶紧找到原文记录一下。编译时异常会强制要求我们来进行处理,要么try-catch,要么直接往外抛,设计的最初目的是为了提醒开发人员注意这些异常,比如IOException。但是有些异常实在是处理不了,只有往外抛,但是这好像不太合理,渐渐的程序猿想到了直接封装一下,让编译器认为它是一个运行时异常,并不需要我现在显示处理:try{ }catch(Exception e){ throw new RuntimeException

2021-07-26 11:28:21 184

原创 Effective Java---17 最小化可变性

不可变类不可变类就是被final关键字修饰的类,这样的类为什么说就是不可变的呢?首先final修饰的类中,成员变量是默认的public static final,即在赋值之后不可改变;final类是不能被继承的。因为我们不能在final类实例创建后修改属性的值,所以final类成为不可变类。要创建一个不可变类,需要遵循以下五条规则:不要提供修改对象状态的方法(也称为 mutators,赋值方法例如setter方法)。确保这个类不能被继承。 防止通过子类修改父类。 父类的非private

2021-07-25 22:58:12 135

原创 Effective Java---15 使类和成员的可访问性最小化

前言我自己在平时的编程中其实并未太多思考类和成员的访问性,要么是private,或者就是public直接用起来,大家都知道Java中有四种访问级别,从小到大依次是private(类内可访问)、protected(同包下及子类可访问)、default(同包下类可访问,子类不能)、public(All),那我们为什么需要不同的访问修饰符呢?信息隐藏区分设计良好的组件与设计不佳的组件的最重要的依据是,它们关于隐藏内部数据和其他实现细节的程度。一个设计良好的组件隐藏了它的所有实现细节,干净地将它的 API 与

2021-07-25 16:40:17 172

原创 Effective Java---16 在公共类中使用访问方法而不是公共属性

前言Java的特性:抽象、封装、继承、多态;在Java的设计实现中随处可见这些特性;封装在字面意思上来理解就是将多种东西打包在一起,我们看到的是一个整体,对外部屏蔽一些东西,在Java中即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数/方法都是类的成员。// Degenerate classes like this should not b

2021-07-23 12:00:08 117

原创 Effective Java---20 接口优于抽象类

前言Java有两种机制允许多个类型的实现来进行扩展:接口和抽象类。抽象类即用abstract关键字修饰的类,它的特点是可以存在抽象方法,也可以存在普通方法;接口是用interface关键字修饰的,在Java 8之前只能有抽象方法,在Java 8中允许使用default关键字修饰的普通方法存在,在结构上和抽象类类似,但是抽象类有构造方法的,虽然不能直接实例化,接口就没有。Java的单继承多实现接口优于抽象类的最主要原因就是Java是单继承的,在一定程度上限制了扩展性,限制了它们作为类型定义的使用,我们不

2021-07-23 11:31:56 104

原创 JVM的fast throw机制

前言今天在学习的时候看到Mentor有在提醒大家不要在代码中习惯性抛出NullPointerException,因为有时候不好查询异常来源,我:奥特曼扣了扣脑袋…Fast Throw在他们的聊天中我看到了fast throw机制,于是求助了度娘。。。HotSpot VM有个许多人觉得“匪夷所思”的优化,叫做fast throw:有些特定的隐式异常类型(NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、Arit

2021-07-22 15:03:14 569

原创 Effective Java---12 始终重写 toString 方法

前言虽然 Object 类提供了 toString 方法的实现,但它返回的字符串通常不是使用类的用户想要看到的。 它由类名后跟一个「at」符号(@)和哈希码的无符号十六进制表示组成,例如 PhoneNumber@163b91,这对使用它的人来说实际意义不大。 toString 的通用约定要求,返回的字符串应该是「一个简洁但内容丰富的表示,对人们来说是很容易阅读的」。虽然可以认为 PhoneNumber@163b91 简洁易读,但相比于直接返回字符串: 707-867-5309,高下立判 。 toStrin

2021-07-21 11:20:20 123

原创 Effective Java---09 使用 try-with-resources 语句替代 try-finally 语句

为什么要使用try-finallyJava类库中包含许多必须通过调用close()方法手动关闭的资源,比如“InputStream”、“OutputStream”以及数据库连接Connection,开发者可能会忘记关闭资源,这是肯定会影响性能的。尽管这些资源中有很多使用了finalizer机制作为安全网,但是该机制并不能很好的工作。从以往来看,try-finally 语句是保证资源正确关闭的最佳方式,即使是在程序抛出异常或返回的情况下:// try-finally - No longer the be

2021-07-20 16:40:51 225

原创 Effective Java---08 避免使用Finalizer和Cleaner机制

Finalizer机制finalize()是Object类下的方法,所以任何类都可以重写finalize()方法,只要在子类中重写了该方法,那么类实例对象的回收就会变得复杂;如果重写了finalize()方法,在使用new关键字创建对象时,会同时创建一个finalize实例指向该对象的引用,即使程序已经结束了对该对象的使用,但是JVM并不能回收,因为它会发现还存在一个引用,于是把这个类的引用放入一个finalize机制的引用队列java.lang.ref.Finalizer.ReferenceQueue,

2021-07-20 16:16:05 220

原创 Effective Java---07 消除过期的对象引用

前言接触过C/C++的程序员都知道,我们是需要手动来进行内存的管理的,资源使用结束需要手动释放内存空间;但是Java不一样,Java带有垃圾回收机制,我们在日常码代码的时候并未过多在意内存的管理,因为我们知道JVM会自动GC,但是我们真的不用管理吗?JVM在什么时候会进行垃圾回收呢?回收的时候涉及哪些资源对象呢?强引用、软引用、弱引用和虚引用强引用是使用最普遍的引用,就是直接引用,通过强引用可以直接访问目标对象。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object strongR

2021-07-16 11:56:53 163

原创 Effective Java---06 避免创建不必要的对象

前言在每次需要时重用一个对象而不是创建一个新的相同功能对象通常是首先考虑的的。重用可以更快使用更顺利。如果对象是不可变的,它总是可以被重用。问题引出作为一个不应该这样做的极端例子,请考虑以下语句:String s = new String("bikini"); // DON'T DO THIS!语句每次执s行时都会创建一个新的 String 实例,而这些对象的创建都不是必需的。String 构造方法 ("bikini") 的参数本身就是一个 bikini 实例,它与构造方法创建的所有对象的功能

2021-07-15 20:08:32 58

原创 Effective Java---11 重写 equals 方法时同时也要重写 hashcode 方法

前言Java中的所有类都继承了Object类,equals()和hashCode()就来自于Object类;我创建了一个Object类的实例,不去重写hashCode方法,直接输出: Object obj = new Object(); System.out.println(obj.hashCode());默认的hashCode方法的返回值形式:这串数字是什么呢?打来源码查看注释;在hashCode方法注释中,调用hashCode方法默认返回的值被称为哈希码值。看到有文章说

2021-07-15 19:53:26 169 1

原创 Effective Java---05 依赖注入优于硬连接资源

在看到这个Item时,第一反应:什么是依赖注入?什么是硬连接?分别是怎么实现的?为什么前者优于后者?背景许多类依赖于一个或多个底层资源。例如,拼写检查器依赖于字典。将此类类实现为静态工具类并不少见 :// Inappropriate use of static utility - inflexible & untestable!public class SpellChecker { private static final Lexicon dictionary = ...;

2021-07-15 00:00:43 128

原创 Effective Java---04 使用私有构造器执行非实例化

Effective Java—04 使用私有构造器执行非实例化背景试想一下,你创建了一个工具类,工具类的所有成员都是静态的以便我们可以全局访问(当然工具类的实现方式也可以通过单例来实现,此处我们不讨论这种方式),我们还有必要提供构造方法吗,或者说构造方法的意义在哪,自然是没有的,还会占用资源!所以我们不希望外部通过调用构造方法创建实例来访问工具类中的成员,大家肯定会想到将构造方法私有化。这就是非实例化:不用实例化的类。(实例化没有任何意义,此时这个类我们希望它是非实例化的)实现public clas

2021-07-14 11:20:06 85

原创 Effective Java---03 使用私有构造方法或枚类实现 Singleton 属性

Effictive Java—03 使用私有构造方法或枚类实现 Singleton 属性SingletonSingleton是指仅仅被实例化过一次的类。它通常被用来表示本质上唯一的系统的组件,例如,窗口组件或文件系统。使用场景想控制实例数目,节省系统资源的时候。例如web中的计数器,不用每次刷新都在数据库里加一次,用单例模式实现且缓存起来。实现方式有两种常见的方法来实现单例。两者都基于保持构造方法私有和提供公共静态成员以提供对唯一实例的访问。保持构造方法私有构造方法私有化后外部就无法通过ne

2021-07-13 20:05:30 102

原创 Redis持久化-RDB

Redis持久化-RDBSAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求。参考:https://www.cnblogs.com/

2021-07-13 18:44:52 32

原创 Effective Java---02 当构造方法参数过多时使用builder模式

Effective Java---02 当构造方法参数过多时使用builder模式定义使用场景解决问题方式一方式二builder模式如何在客户端使用定义The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so the same construction process can create differ

2021-07-13 13:32:15 197

原创 Java基础复习

Java基础一、jdk1.java开发工具包(包含 jre(java运行环境) 和 jvm(java虚拟机))JAVA_HOME: JDK的安装路径,例如:D:\Java\jdk-11.0.3 设置此变量的作用是:可以方便地修改JDK的安装路径,以免频繁修改系统path变量造成的风险。path: %JAVA_HOME%\bin;%path% 作用是:使得系统可以在任何路径下都可以识别由JDK提供的外部命令,如javac、java等(命令行程序)。classpath: 设定 经过javac编译后

2020-11-17 21:30:02 674 1

原创 小白型计算机毕业生秋招做的简单的准备

小白秋招做的简单的准备和面试经历复习基本的知识点:SE:EE:SSM:MySQL:操作系统:部分面试经历:泛微一面: 已挂汉得二面:已挂久远银海: 通过差旅一号 : 通过海康交通大数据: 通过小鱼易连:通过复习基本的知识点:SE:1、集合框架(ArrayList和HashMap、ConcurrentHashMap),HashMap和HashTable的区别 熟悉2、IO(BIO、NIO、AIO)

2020-11-17 21:04:56 453 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除