Apex - Interfaces

Una interfaz es como una clase de Apex en la que no se ha implementado ninguno de los métodos. Solo contiene las firmas del método, pero el cuerpo de cada método está vacío. Para usar una interfaz, otra clase debe implementarla proporcionando un cuerpo para todos los métodos contenidos en la interfaz.

Las interfaces se utilizan principalmente para proporcionar la capa de abstracción para su código. Separan la implementación de la declaración del método.

Tomemos un ejemplo de nuestra empresa química. Supongamos que necesitamos proporcionar el descuento a los clientes Premium y Ordinarios y los descuentos para ambos serán diferentes.

Crearemos una interfaz llamada 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;
   }
}

Cuando implementa la interfaz, es obligatorio implementar el método de esa interfaz. Si no implementa los métodos de interfaz, arrojará un error. Debe utilizar Interfaces cuando desee que la implementación del método sea obligatoria para el desarrollador.

Interfaz estándar de Salesforce para Batch Apex

SFDC tiene interfaces estándar como Database.Batchable, Schedulable, etc. Por ejemplo, si implementa la interfaz Database.Batchable, entonces debe implementar los tres métodos definidos en la Interfaz: Inicio, Ejecución y Finalización.

A continuación, se muestra un ejemplo de la interfaz de base de datos estándar provista por Salesforce que envía correos electrónicos a los usuarios con el estado del lote. Esta interfaz tiene 3 métodos, Iniciar, Ejecutar y Finalizar. Usando esta interfaz, podemos implementar la funcionalidad Batchable y también proporciona la variable BatchableContext que podemos usar para obtener más información sobre el Batch que se está ejecutando y para realizar otras 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 ejecutar esta clase, debe ejecutar el siguiente código en Developer Console.

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