Apex - Interfaces

Uma interface é como uma classe Apex na qual nenhum dos métodos foi implementado. Ele contém apenas as assinaturas do método, mas o corpo de cada método está vazio. Para usar uma interface, outra classe deve implementá-la fornecendo um corpo para todos os métodos contidos na interface.

As interfaces são usadas principalmente para fornecer a camada de abstração para seu código. Eles separam a implementação da declaração do método.

Vamos dar um exemplo de nossa empresa química. Suponha que precisemos fornecer o desconto para clientes Premium e Ordinários e os descontos para ambos serão diferentes.

Vamos criar uma interface chamada de DiscountProcessor.

// Interface
public interface DiscountProcessor {
   Double percentageDiscountTobeApplied(); // method signature only
}

// Premium Customer Class
public class PremiumCustomer implements DiscountProcessor {
   
   //Method Call
   public Double percentageDiscountTobeApplied () {
      
      // For Premium customer, discount should be 30%
      return 0.30;
   }
}

// Normal Customer Class
public class NormalCustomer implements DiscountProcessor {
   
   // Method Call
   public Double percentageDiscountTobeApplied () {
      
      // For Premium customer, discount should be 10%
      return 0.10;
   }
}

Quando você implementa a Interface, é obrigatório implementar o método dessa Interface. Se você não implementar os métodos de interface, ocorrerá um erro. Você deve usar Interfaces quando quiser tornar a implementação do método obrigatória para o desenvolvedor.

Interface Salesforce padrão para Batch Apex

SFDC tem interfaces padrão como Database.Batchable, Schedulable, etc. Por exemplo, se você implementar a Interface Database.Batchable, deverá implementar os três métodos definidos na Interface - Iniciar, Executar e Concluir.

Abaixo está um exemplo para a Interface Database.Batchable fornecida pelo Salesforce padrão que envia e-mails para usuários com o Status do lote. Esta interface possui 3 métodos: Iniciar, Executar e Concluir. Usando esta interface, podemos implementar a funcionalidade Batchable e também fornece a variável BatchableContext que podemos usar para obter mais informações sobre o Batch que está em execução e para realizar outras funcionalidades.

global class CustomerProessingBatch implements Database.Batchable<sobject7>,
Schedulable {
   // Add here your email address
   global String [] email = new String[] {'[email protected]'};

   // Start Method
   global Database.Querylocator start (Database.BatchableContext BC) {
      
      // This is the Query which will determine the scope of Records and fetching the same
      return Database.getQueryLocator('Select id, Name, APEX_Customer_Status__c,
         APEX_Customer_Decscription__c From APEX_Customer__c WHERE createdDate = today
         && APEX_Active__c = true');
   }

   // Execute method
   global void execute (Database.BatchableContext BC, List<sobject> scope) {
      List<apex_customer__c> customerList = new List<apex_customer__c>();
      List<apex_customer__c> updtaedCustomerList = new List<apex_customer__c>();
      
      for (sObject objScope: scope) {
         // type casting from generic sOject to APEX_Customer__c
         APEX_Customer__c newObjScope = (APEX_Customer__c)objScope ;
         newObjScope.APEX_Customer_Decscription__c = 'Updated Via Batch Job';
         newObjScope.APEX_Customer_Status__c = 'Processed';
         
         // Add records to the List
         updtaedCustomerList.add(newObjScope);
      }

      // Check if List is empty or not
      if (updtaedCustomerList != null && updtaedCustomerList.size()>0) {
         
         // Update the Records
         Database.update(updtaedCustomerList); System.debug('List Size
            '+updtaedCustomerList.size());
      }
   }

   // Finish Method
   global void finish(Database.BatchableContext BC) {
      Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
      
      // get the job Id
      AsyncApexJob a = [Select a.TotalJobItems, a.Status, a.NumberOfErrors,
      a.JobType, a.JobItemsProcessed, a.ExtendedStatus, a.CreatedById,
      a.CompletedDate From AsyncApexJob a WHERE id = :BC.getJobId()];
      System.debug('$$$ Jobid is'+BC.getJobId());
      
      // below code will send an email to User about the status
      mail.setToAddresses(email);
     
      // Add here your email address
      mail.setReplyTo('[email protected]');
      mail.setSenderDisplayName('Apex Batch Processing Module');
      mail.setSubject('Batch Processing '+a.Status);
      mail.setPlainTextBody('The Batch Apex job processed
         '+a.TotalJobItems+'batches with '+a.NumberOfErrors+'failures'+'Job Item
         processed are'+a.JobItemsProcessed);
      Messaging.sendEmail(new Messaging.Singleemailmessage [] {mail});
   }

   // Scheduler Method to scedule the class
   global void execute(SchedulableContext sc) {
      CustomerProessingBatch conInstance = new CustomerProessingBatch();
      database.executebatch(conInstance,100);
   }
}

Para executar esta classe, você deve executar o código abaixo no console do desenvolvedor.

CustomerProessingBatch objBatch = new CustomerProessingBatch ();
Database.executeBatch(objBatch);