84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
让某 method 明确声明: 我不接受 null 参数, 传了 null , 我马上崩溃 !
并且, 该抛错在编译阶段抛出, 不要跑到运行时去
欢迎选择我的课程,让我们一起见证您的进步~~
Java的类型系统不支持,只能通过插件实现: Checker Framework,要添加注解,在编译时指定插件。
上面实现了编译器检测null了,至于传了null就崩溃,能通过插件插入null check代码的方式实现。
好问题,平时只关注怎么实现功能,却没怎么想过为什么Java不这样去实现,例如此问题。也勾起了我很多天马行空的想象,如果Java语法支持该多好啊,开发效率至少高几倍吧,不过再想想好像有点不对劲吧。
假设Java支持这样的语法,使用注解:@NotNull标识参数不为空
@NotNull
一个这样场景:用户登录成功后,更新用户的登录时间和ip。
用户数据有:
更新用户信息伪代码:
public void updateAccount(@NotNull Account account) { // 因为肯定不为空,可以放心大胆的更新Account的最新登录时间、ip }
@NotNull表示参数:account不能为空,这里没什么问题。
account
获取用户信息验证登录伪代码:
public Account login(String name) { // 1、连接数据库 // 2、根据用户名获取Account // 3、验证用户信息 // 4、验证成功返回Account信息,验证失败返回null }
我们只是参数不能为空,并不让返回值不为空,这样也没什么问题。
主逻辑判断伪代码:
public static void main(String[] args) { AccountService service = new AccountService(); // aaa登录 Account account = service.login("aaa","123456"); service.updateAccount(account); // bbb登录 Account account = service.login("bbb","123456"); service.updateAccount(account); // ccc登录 Account account = service.login("ccc","123456"); service.updateAccount(account); }
那么问题来了,account参数到底能不能传入service.updateAccount()方法,编译能不能通过?从数据库中读取的Accoount对象本来就是个模凌两可对象,有可能代表某个人,也有可能是null。
service.updateAccount()
Accoount
null
是的,可以这样,这就变成了一种模式叫空对象设计模式(NullObject Pattern) ,意思就是建立一个专用的空对象,以此来代表结果为空。
详细请查阅:
https://segmentfault.com/q/10...
http://www.cnblogs.com/haodaw...
Java的类型系统不支持,只能通过插件实现: Checker Framework,要添加注解,在编译时指定插件。
上面实现了编译器检测null了,至于传了null就崩溃,能通过插件插入null check代码的方式实现。
好问题,平时只关注怎么实现功能,却没怎么想过为什么Java不这样去实现,例如此问题。也勾起了我很多天马行空的想象,如果Java语法支持该多好啊,开发效率至少高几倍吧,不过再想想好像有点不对劲吧。
NullPointerException是运行时异常是有一定道理的
假设Java支持这样的语法,使用注解:
@NotNull
标识参数不为空一个这样场景:用户登录成功后,更新用户的登录时间和ip。
用户数据有:
更新用户信息伪代码:
@NotNull
表示参数:account
不能为空,这里没什么问题。获取用户信息验证登录伪代码:
我们只是参数不能为空,并不让返回值不为空,这样也没什么问题。
主逻辑判断伪代码:
那么问题来了,account参数到底能不能传入
service.updateAccount()
方法,编译能不能通过?从数据库中读取的Accoount
对象本来就是个模凌两可对象,有可能代表某个人,也有可能是null
。那就把返回值也变成不为空的?
是的,可以这样,这就变成了一种模式叫空对象设计模式(NullObject Pattern) ,意思就是建立一个专用的空对象,以此来代表结果为空。
详细请查阅:
https://segmentfault.com/q/10...
http://www.cnblogs.com/haodaw...