Apex - Interfacce

Un'interfaccia è come una classe Apex in cui nessuno dei metodi è stato implementato. Contiene solo le firme del metodo, ma il corpo di ogni metodo è vuoto. Per utilizzare un'interfaccia, un'altra classe deve implementarla fornendo un corpo per tutti i metodi contenuti nell'interfaccia.

Le interfacce vengono utilizzate principalmente per fornire il livello di astrazione per il codice. Separano l'implementazione dalla dichiarazione del metodo.

Facciamo un esempio della nostra azienda chimica. Supponiamo di dover fornire lo sconto ai clienti Premium e Ordinary e gli sconti per entrambi saranno diversi.

Creeremo un'interfaccia chiamata 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 si implementa l'interfaccia, è obbligatorio implementare il metodo di tale interfaccia. Se non si implementano i metodi dell'interfaccia, verrà generato un errore. È necessario utilizzare le interfacce quando si desidera rendere l'implementazione del metodo obbligatoria per lo sviluppatore.

Interfaccia Salesforce standard per Batch Apex

SFDC ha interfacce standard come Database.Batchable, Schedulable, ecc. Ad esempio, se si implementa l'interfaccia Database.Batchable, è necessario implementare i tre metodi definiti nell'interfaccia: Start, Execute e Finish.

Di seguito è riportato un esempio dell'interfaccia Database.Batchable fornita da Salesforce che invia messaggi di posta elettronica agli utenti con lo stato batch. Questa interfaccia ha 3 metodi, Start, Execute e Finish. Utilizzando questa interfaccia, possiamo implementare la funzionalità Batchable e fornisce anche la variabile BatchableContext che possiamo usare per ottenere maggiori informazioni sul Batch in esecuzione e per eseguire altre funzionalità.

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);
   }
}

Per eseguire questa classe, devi eseguire il codice seguente nella Developer Console.

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