最近在阅读SpringBoot的源码,发现SpringBoot有一个很有意思的类—Assert(断言),特此纪录一下。
一、问题重现
新人菜鸡们(比如我),都会下意识的使用if
这种判断句来判断某些条件是否成立,然后再进行处理(比如抛出异常啥的)。
例如:
public void main(int x){
.....
if( x < 0 ){
throw new RuntimeException("传入的数据不能小于0");
}
.....
}
程序的编写中不可避免的会出现此类代码,这是很正常的事情。但是一旦代码规模大起来,这种if
判断会显得特别繁杂。同时,各位帅哥美女们仔细观察(很细啊!)就能发现很多if
的逻辑都是大同小异的。那么怎样做才能更优雅更快(更多时间摸鱼)的写这种代码呢?
二、SpringBoot中的Assert
其实巨佬们都将答案写在源码上了(=,=)。这时候我们就能看一下SpringBoot的源码~
1.先引入概念
-
什么是Assert:
assert是Java的一个保留字,从JAVA SE 1.4 引入的,表示断言。
-
SpringBoot中的Assert
SpringBoot引入了Assert机制,在
org.springframework.util.Assert
类中,基本上替代传统的if判断然后抛出异常的业务代码,使代码变得简洁,提高程序可读性。
2.细看大佬的操作
以SpringBoot2.3.4.RELEASE版本为例
// org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.class
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
这个方法中包含了这么一句Assert.notEmpty(xxx,"xxxxx")
。没怎么了解过Assert的各位吴彦祖或者刘亦菲们就会发出疑问:介系个嘛呀?点进去康康,看看能不能找到点 鸡脚 什么的。
鸡脚 如下:
// org.springframework.util.Assert.class
public abstract class Assert {
public Assert() {}
...
public static void notEmpty(@Nullable Collection<?> collection, String message) {
if (CollectionUtils.isEmpty(collection)) {
throw new IllegalArgumentException(message);
}
}
...
}
看到这里,大家懂的都懂,其实Assert
就是一个工具类,将一些常用的判断提取出来封装成一个工具类,看看行不行,不行就抛个异常什么的。很强啊!平平无奇的一个小操作,使代码变得简洁,提高程序可读性。
三、化为己用
俗话说的好,学而不思则罔。我们要怎么做才能将我们的代码变得更简洁呢?
- 直接调用断言函数
我们在写的时候可以先看看Assert有没有写类似的代码,有的话直接调用就好了(舒服~) - 继承Assert类实现更多功能
我们可以继承Assert类,扩展属于我们的方法,同时配合SpringBoot全局异常处理@ExceptionHandler(SQLException.class)
,将异常抛出、异常处理全部从业务代码中剔除出来(美汁汁~)
例子:还没写好,未完待续…
四、总结
Assert就是封装了一些常用判断的工具类,我们可以灵活使用它让我们的代码变得更加漂亮优雅。