Pages

Saturday 3 October 2020

Safe Navigation Operator | Winter '21 Release

 In Winter '21 Salesforce Release, Salesforce has introduced a new operator called "Safe Navigation Operator".  This operator will help us to avoid NullPointer Exceptions and reduce lines of code and make the code more cleaner. 

This is not something new, this already exist in many other programming languages (also known as optional chaining operator, safe call operator, null-conditional operator).

the safe navigation operator is a binary operator that returns null if its first argument is null; otherwise it performs a dereferencing operation as specified by the second argument.

The main advantage of using this operator is this avoids multiple if s and else conditions.

If the left-hand-side of the chain expression evaluates to null, the right-hand-side is not evaluated. Use the safe navigation operator (?.) in method, variable, and property chaining. The part of the expression that is not evaluated can include variable references, method references, or array expressions.

Example

  • This example first evaluates a, and returns null if a is null. Otherwise, the return value is a.b.
    a?.b // Evaluates to: a == null? Null : a.b
  • This example returns null if a[x] evaluates to null. If a[x] does not evaluate to null and aMethod() returns null, then this expression throws a null pointer exception.
    a[x]?.aMethod().aField // Evaluates to null if a[x] == null
  • This example returns null if a[x].aMethod() evaluates to null.
    a[x].aMethod()?.aField 
  • This example indicates that the type of the expression is the same, whether the safe navigation operator is used in the expression or not.
    Integer x = anObject?.anIntegerField; // The expression is of type Integer because the field is of type Integer
  • This example shows a single statement replacing a block of code that checks for nulls.
    // Previous code checking for nulls
    String profileUrl = null;
    if (user.getProfileUrl() != null) {
    	profileUrl = user.getProfileUrl().toExternalForm();
    	}
    // New code using the safe navigation operator
    String profileUrl = user.getProfileUrl()?.toExternalForm();
  • This example shows a single-row SOQL query using the safe navigation operator.
    // Previous code checking for nulls
    results = [SELECT Name FROM Account WHERE Id = :accId];
    if (results.size() == 0) { // Account was deleted
        return null;
    }
    return results[0].Name;
    // New code using the safe navigation operator
    return [SELECT Name FROM Account WHERE Id = :accId]?.Name;

 See Also

https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/langCon_apex_SafeNavigationOperator.htm