让某 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...