老铁们,我们先来对以下两段代码。
package com.qianfeng.asserts;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
@Service
public class LoginService {
public void login(String name, String password) {
if (name == null || name.isEmpty()) {
throw new RuntimeException("请输入用户名");
}
if (password == null || password.isEmpty()) {
throw new RuntimeException("请输入密码");
}
.....
}
}
在上面的代码中,我们判断了数据的合法性,如果不满足需求,通过抛出运行时异常的方式中断程序执行。如果是以代码行数作为老任的绩效考核标准,老任肯定可以把老板写破产。
其实我们完全可以把以上代码换一种写法,比如下面的这种写法:
package com.qianfeng.asserts;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
@Service
public class LoginService {
public void login(String name, String password) {
Assert.notNull(name, "请输入用户名");
Assert.notNull(password, "请输入密码");
......
}
}
如果name或者password的值为null,就会抛出异常。这种代码,看着是不是清爽了很多
断言
在上述代码中,我们其实使用了Spring中的断言类。
断言(assert)其实是jdk 1.4中提供的一个关键字,使用断言,可以实现对数据的快速验证。Assert类借助了该思想,优雅地实现了数据的验证。
我们来看看Assert类中notNull()方法的源码:
现在你看到了,该方法的实现很简单,满足判断条件,就抛出IllegalArgumentException
异常。Assert类中还有很多其他的方法,它们的实现思想都是一模一样的。
但是这样写,只能抛出IllegalArgumentException
异常,而且不能根据特定类型的数据进行更全面的判断。如果我们想进行定制,想要抛出自定义的异常,还需要我们自己动手,丰衣足食。
自定义断言类
1.自定义异常类
通常情况下,我们都会在项目中自定义自己的异常类,用于处理各种异常信息。
package com.qianfeng.asserts;
/**
* 自定义异常类
*/
public class MyException extends RuntimeException {
/**
* 异常编码
*/
private int code;
/**
* 异常信息
*/
private String msg;
public MyException(int code, String msg) {
this.code = code;
this.msg = msg;
}
}
2.自定义断言类
接下来我们来自定义一个断言,如下所示:
package com.qianfeng.asserts;
/**
* 自定义断言类
*/
public class MyAssert {
/**
* 如果待判断的数据为null,抛出异常
* @param info
* @param message
*/
public static void assertNotEmpty(String info, String message) {
if (info == null || info.trim().isEmpty()) {
throw new MyException(CommonConstants.ERROR, message);
}
}
}
3.测试
现在代码写好啦,我们来测试一下吧。
package com.qianfeng.asserts;
import org.springframework.stereotype.Service;
@Service
public class LoginService {
public void login(String name, String password) {
MyAssert.assertNotEmpty(name, "请输入用户名");
MyAssert.assertNotEmpty(password, "请输入密码");
......
}
}
老任在这里只是抛砖引玉,我们可以根据实际需求再增加其他的断言判断。
如果你还有不明白的地方,可以在评论区或私信给我~~