Java中一致的Null值处理

null值的处理通常被认为是Java的薄弱环节,原因有很多。

最常提及的问题是著名的问题NullPointerException,尽管没有明确的理由说明为什么这是一个问题。毕竟,这只是问题的征兆,而不是问题本身。

实际问题更深。那些具有使用CC ++编写代码的经验的人都非常了解此问题。在使用C / C ++进行编码时,工程师应始终牢记与访问安全,未定义行为,内存分配,对象复制/移动等有关的无数细微差别。所有这些众多的细节会产生持续的压力,消耗宝贵的工程师大脑资源,并导致开发速度降低。即使是核心的C / C ++支持者也不能否认这一事实。

nullJava中的值也存在类似的问题。

Java通常被认为是一种冗长的语言。确实如此。这是其明确性的缺点。Java中几乎所有的意图都可以(通常是)用代码显式表达。通过添加一些额外的文本,我们又获得了可立即访问的上下文,在阅读Java代码时不需要将其携带在头部。这些null值违反了此规则。他们不会在代码中显示自己。

这些null值可能由于各种原因而出现。它可以是默认初始化,从某些方法返回的值,甚至是显式分配的null值。请记住,有时null可能会出现,请检查方法文档或代码中是否有返回此类值的可能-所有这些都会产生与上述C / C ++非常相似的压力

如何解决这个问题?我们如何消除影响生产率的恒定压力

当然,有多种解决方法。

我们可以:

  • 添加@NotNull(或类似)注释。除了添加一些(假)感觉null值以某种方式处理之外,基本上什么都不会做。
  • 建立严格的规则并检查可能存在的每个值null。这是一个可行的解决方案,但是以无数null检查污染代码为代价。而且,没有人是完美的。我们可能会犯错误,编译器将无济于事。
  • 发明自己的语言。Kotlin的作者就是这样做的。再次,这是一个可行的解决方案,但对我来说太过分了。然而,它有一件重要的事情:可空和不可空类型是不同的,并且在代码中清楚地表示出来。
  • 使用函数式编程方法Maybe-monad的某种形式。

最后一点是我将要详细讨论的内容。

Optional 黄金三镖客

Java 8中引入的  Optional类旨在处理缺失值,而不是null。在某种程度上,它是Maybemonad Java实现(但不完全,请参见下文)。

尽管有些人认为这只是一种与null价值观打交道的好方法,但实际上它具有更为重要的好处:明确表达意图。将字段,参数或变量包装到中后Optional,你立即将意图明确并向读者清楚。换句话说,你正在添加缺少的上下文。同时,编译器开始出现差异,因此你不再孤单。

因此,Optional工程师使用,用一块石头杀死了三只鸟:

  • 使潜在的缺失值在代码中明确显示,并消除阅读器的“压力”。
  • 使编译器可以控制对值的访问。
  • 使null值的处理变得方便。

不幸的是,  Optional有它自己的问题。

如上所述,Optional一定程度上执行Maybemonad。它崇尚命令式世界,并具有外部可访问的价值。通过调用该  get()方法,你可以尝试检索它。但是,如果这样做,它可能会抛出NullPointerException,这违背了整个目的Optional是潜在(即缺失)值的安全容器null

也许这就是为什么一些聪明的头脑建议使用Optional字段和参数是不正确的做法的原因,而静态分析工具会针对此类用法显示警告Optional

解决方案可能是编写你自己的版本Maybe并使用它。周围有几种不同的实现。我正在使用我的Reactive Toolbox Core库中的一个库。

摘要

OptionalOptionMaybe使Java工程师使用以下约定:

  • 每个具有普通类型的变量/字段/参数都不为null,也不能为null。
  • 每个类型包装在OptionalOption/中的变量/字段/参数都Maybe可能为空。
  • 如果某些外部库/调用可以返回null值,则结果应立即包装在OptionalOption/中Maybe

无需任何额外的努力,严格遵循上述约定即可编写Java代码,该代码包括:

  • 永不抛出NullPointerException并且null正确处理了所有值。
  • 清楚明确地区分代码中的可为空和不可为空的值,并使编译器在编译时强制执行此区分。

有什么问题可以加下qq:2062583349。也可添加vx:admindesire,有java、python、web等习资料和视频课程干货”。欢迎交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值