Apex - Interfaces

Une interface est comme une classe Apex dans laquelle aucune des méthodes n'a été implémentée. Il ne contient que les signatures de méthode, mais le corps de chaque méthode est vide. Pour utiliser une interface, une autre classe doit l'implémenter en fournissant un corps pour toutes les méthodes contenues dans l'interface.

Les interfaces sont principalement utilisées pour fournir la couche d'abstraction de votre code. Ils séparent l'implémentation de la déclaration de la méthode.

Prenons un exemple de notre société chimique. Supposons que nous devions offrir la remise aux clients Premium et Ordinaire et que les remises pour les deux seront différentes.

Nous allons créer une interface appelée 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;
   }
}

Lorsque vous implémentez l'interface, il est obligatoire d'implémenter la méthode de cette interface. Si vous n'implémentez pas les méthodes Interface, une erreur sera générée. Vous devez utiliser des interfaces lorsque vous souhaitez rendre l'implémentation de la méthode obligatoire pour le développeur.

Interface Salesforce standard pour Batch Apex

SFDC a des interfaces standard telles que Database.Batchable, Schedulable, etc. Par exemple, si vous implémentez l'interface Database.Batchable, vous devez implémenter les trois méthodes définies dans l'interface - Start, Execute et Finish.

Vous trouverez ci-dessous un exemple d'interface Database.Batchable fournie par Salesforce standard qui envoie des e-mails aux utilisateurs avec l'état du lot. Cette interface dispose de 3 méthodes, Démarrer, Exécuter et Terminer. En utilisant cette interface, nous pouvons implémenter la fonctionnalité Batchable et elle fournit également la variable BatchableContext que nous pouvons utiliser pour obtenir plus d'informations sur le Batch en cours d'exécution et pour exécuter d'autres fonctionnalités.

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

Pour exécuter cette classe, vous devez exécuter le code ci-dessous dans la Developer Console.

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