实际开发中 assert 用的多吗?

2020-07-23 09:34:04 +08:00
 wushigejiajia01

我是个后端 JAVA 开发, 搬砖三年多了

基本没看到有人用过 Assert, 最近在看一个项目中的代码, 发现有人用 Assert

百度查了一下才知道这个东西的作用, 初步理解就是 if...else 的另一种写法

关键这个东西已经被划上横线, 不建议使用了

我搜了一下这个项目里用的不算少, 大多是在 service 层入参的时候使用的, 这样有什么问题吗?

大家在实际开发中用的多吗? 有什么需要注意的呢?

5813 次点击
所在节点    Java
38 条回复
BrettD
2020-07-23 09:36:46 +08:00
C/C++工程里面感觉用的还是挺多的
securityCoding
2020-07-23 09:39:32 +08:00
基本都在单元测试中使用 , 业务中都是抛出明确的自定义异常
wushigejiajia01
2020-07-23 09:42:10 +08:00
@securityCoding
我现在看的这个项目中 大多是下面这样的用法
Assert.notNull(projectId);

其中 notnull 还是被横线划掉不推荐使用的状态......不知道这样是否合适
BBCCBB
2020-07-23 09:45:15 +08:00
> Assert.notNull(projectId);

> 其中 notnull 还是被横线划掉不推荐使用的状态......不知道这样是否合适


这个主要是需要指定第二个参数, 写一个提示信息, 不然只会报一个空指针. 排查不了问题, 这个 Assert 相当于白写.
Vegetable
2020-07-23 09:45:49 +08:00
可以说不应该用吧,某些语言甚至可以直接在运行时屏蔽 Assert,这东西不应该出现在逻辑中,应该是调试工具。
palmers
2020-07-23 09:47:03 +08:00
业务代码中很少直接使用的 ,一般都是包装一个类似的工具 比如 spring 源码里 自己包装了对象的各种判断 空和参数错误, 如果通过返回原值, 否则抛对应的异常 这样代码看起来会很简洁明了 不会在主线中添加很多校验判断
Jrue0011
2020-07-23 10:12:38 +08:00
你用的应该是某个类名 Assert 的工具类,而不是 Java 自己提供的 assert 关键字? Java 的 assert 关键字貌似网上都说不推荐使用,工具类一半是可以的。
至于你说的划横线是因为方法上有 @Deprecated 注解所以 IDE 提示你方法过时吧,一般这种情况源码注释里都有推荐替代的方法。
zsdroid
2020-07-23 10:13:51 +08:00
被横线划掉不推荐使用,因为推荐传第二个参数。比如`Assert.isNull(editDto.getId(), "请输入 id");`
zsdroid
2020-07-23 10:17:10 +08:00
/**
* Assert that an object is not {@code null}.
* @deprecated as of 4.3.7, in favor of {@link #notNull(Object, String)}
*/
glaucus
2020-07-23 10:17:20 +08:00
参数校验当然有更优雅的做法了,尤其是在 Spring 里
zsdroid
2020-07-23 10:19:04 +08:00
多看源码吧。
一般在 Deprecated 一个方法的时候,会在注释中写明,为什么不推荐,用什么方法代替。
chihiro2014
2020-07-23 10:19:28 +08:00
Spring 中用得很多
meeop
2020-07-23 10:53:20 +08:00
不会用,严重不推荐
对于异常数据,应该在上线前作为 bug 休掉,对于可能的异常数据(如表单数据校验),应该抛出包装好更友善的异常并日志
assert 只是在单元测试,或者项目初期测试用
dcty
2020-07-23 11:06:19 +08:00
我一般用在非 release 环境下
Jonz
2020-07-23 11:09:46 +08:00
只推荐在调试的时候使用?
byzf
2020-07-23 14:50:49 +08:00
上面估计都是客户端. 服务端还是要用的, 服务端有时候保证进程会崩溃是很关键的.
wongy
2020-07-23 15:06:07 +08:00
Assert.notNull(obj, message);
在我构建的项目中经常使用,里面包装自己的业务异常,然后由统一业务异常处理器解释并返回提示内容;
在少数参数校验、检查数据库查询返回、流程必要参数检查 非常实用。
across
2020-07-23 15:08:25 +08:00
自己做模块时不会加么····
不过 release 不给放,反正触发了就是有 bug 。
Vegetable
2020-07-23 15:12:53 +08:00
@byzf #16 关键 assert 和 if...throw 其实是一样的吧,而且更方便上级根据不同的 exception 处理,所以不推荐这个
tantalu
2020-07-23 15:55:25 +08:00
一般用这个 Objects.requireNonNull()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX