Apex - Schnittstellen

Eine Schnittstelle ist wie eine Apex-Klasse, in der keine der Methoden implementiert wurde. Es enthält nur die Methodensignaturen, aber der Hauptteil jeder Methode ist leer. Um eine Schnittstelle zu verwenden, muss eine andere Klasse sie implementieren, indem sie einen Body für alle in der Schnittstelle enthaltenen Methoden bereitstellt.

Schnittstellen werden hauptsächlich zum Bereitstellen der Abstraktionsschicht für Ihren Code verwendet. Sie trennen die Implementierung von der Deklaration der Methode.

Nehmen wir ein Beispiel unserer Chemiefirma. Angenommen, wir müssen Premium- und Stammkunden den Rabatt gewähren, und die Rabatte für beide sind unterschiedlich.

Wir werden eine Schnittstelle namens the erstellen 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;
   }
}

Wenn Sie die Schnittstelle implementieren, muss die Methode dieser Schnittstelle implementiert werden. Wenn Sie die Interface-Methoden nicht implementieren, wird ein Fehler ausgegeben. Sie sollten Schnittstellen verwenden, wenn Sie die Methodenimplementierung für den Entwickler obligatorisch machen möchten.

Standard Salesforce-Schnittstelle für Batch Apex

SFDC verfügt über Standardschnittstellen wie Database.Batchable, Schedulable usw. Wenn Sie beispielsweise die Database.Batchable-Schnittstelle implementieren, müssen Sie die drei in der Schnittstelle definierten Methoden implementieren - Start, Execute und Finish.

Im Folgenden finden Sie ein Beispiel für die von Standard Salesforce bereitgestellte Database.Batchable-Schnittstelle, über die E-Mails an Benutzer mit dem Stapelstatus gesendet werden. Diese Schnittstelle verfügt über drei Methoden: Start, Ausführen und Beenden. Über diese Schnittstelle können wir die Batchable-Funktionalität implementieren und sie stellt auch die BatchableContext-Variable bereit, mit der wir weitere Informationen über den ausgeführten Batch abrufen und andere Funktionen ausführen können.

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

Um diese Klasse auszuführen, müssen Sie den folgenden Code in der Entwicklerkonsole ausführen.

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