O operador de navegação segura (Safe Navigation Operator), representado pelo símbolo ?.
, é uma funcionalidade na linguagem de programação Apex da Salesforce que permite aos desenvolvedores acessar membros de um objeto (como métodos ou propriedades) de maneira segura, sem o risco de encontrar erros de referência nula.
A importância do operador de navegação segura reside na sua capacidade de simplificar o código ao lidar com objetos que podem ser nulos, melhorando a manutenibilidade e a segurança do código.
Benefícios
- Redução de Código: Minimiza a necessidade de verificações de nulidade explícitas, tornando o código mais limpo e legível.
- Prevenção de Erros: Diminui a probabilidade de erros em tempo de execução causados por referências nulas.
Exemplo 1: Acesso a Propriedade de Objeto
Account acc = [SELECT Id, Name, (SELECT Id, LastName FROM Contacts LIMIT 1) FROM Account LIMIT 1];
String contactLastName = acc.Contacts?.get(0)?.LastName;
System.debug(contactLastName); // Imprime o sobrenome do primeiro contato se existir, caso contrário, não faz nada.
Este exemplo demonstra como acessar o sobrenome do primeiro contato de uma conta de forma segura, sem causar um NullPointerException se Contacts for nulo ou vazio.
Exemplo 2: Chamadas de Método Seguras
public class CustomClass {
public String importantMethod() {
return 'Important Info';
}
}
CustomClass obj = new CustomClass();
String result = obj?.importantMethod();
System.debug(result); // Imprime "Important Info" se obj não for nulo.
obj = null;
result = obj?.importantMethod();
System.debug(result); // Não faz nada pois obj é nulo.
Este exemplo ilustra como chamar um método de um objeto que pode ser nulo sem a necessidade de verificar explicitamente se o objeto é nulo antes da chamada.
Exemplo 3: Encadeamento de Operadores de Navegação Segura
public class OuterClass {
public InnerClass innerInstance;
public class InnerClass {
public String innerProperty = 'Value';
}
}
OuterClass outer = new OuterClass();
String value = outer?.innerInstance?.innerProperty;
System.debug(value); // Não faz nada pois innerInstance é nulo.
outer.innerInstance = outer.new InnerClass();
value = outer?.innerInstance?.innerProperty;
System.debug(value); // Imprime "Value" pois innerInstance agora não é nulo.
Este exemplo mostra como o operador de navegação segura pode ser usado em cadeia para acessar propriedades de objetos aninhados de forma segura, evitando NullPointerException se qualquer um dos objetos na cadeia for nulo.