先介绍一下 Groovy 的safe navigation operator ?.
可以安全地检测出潜在的null值。
比如下面的数据模型 「个人信息/职位/年收入」
public class Person {
private Position position;
public Position getPosition ( ) { return Position }
}
public class Position {
private Salary salary;
public Salary getSalary ( ) { return salary}
}
public class Salary {
private int salary;
public int getSalary ( ) { return salary}
}
现实问题,Person如果是就业前的状态,或者是学生老人情况下,就是没有职位(Position此时就是应该是 null状态,代表值缺失。the absence of a value)
也就没有工资收入。那么getSalary也是null。
因此 编码 工作中,必须要进行 null check,以避免 NullPointerException 的异常抛出。导致程序运行中断。
第①种Null check的写法
public int getPositionSalary (Person person) {
if (Person != null ) {
Position position = person.getPosition ( );
if ( position != null ) {
Salary salary = position.getSalary ( );
}
}
return "Unknown";
}
虽然这样的代码可以正确解决 Null check问题,但是多层次的if嵌套,增加的代码的阅读难度(readablity)。代码可读性原则要时刻牢记。
虽然市面上的大多数的PM经理们/各级leader,小组长等级别,要求就是能跑起来就行。这种要求其实是不负责的,是缺乏专业性的表现,对于技术的提升是没有好处的。作为技术人员,千万不要认为满足了这种要求,就万事大吉了,可以上班摸鱼了,要时刻铭记提升自己的专业技能。
第②种Null check的写法
Public int getPositionSalary (Person person){
if ( person == null ) {
return "Unknown";
}
Position position = person.getPosition ( );
if ( position == null ) {
return "Unknown";
}
Salary salary = position.getSalary ( );
if ( salary == null ) {
return "Unknown";
}
return salary;
虽然第②种写法,避免了深层if嵌套,但是这种解决方法,还不是理想的方法。一是增加了exit points,代码可维护性变差。
上面的代码,用Groovy的 Null check写法如下:
def getPositionSalary = person?.position?.salary
Groovy的safe navigation operator ?. 允许在调用链(invocations chain)中传递空指针(null reference)。