Учебники

Apex — Интерфейсы

Интерфейс подобен классу Apex, в котором ни один из методов не был реализован. Он содержит только сигнатуры методов, но тело каждого метода пусто. Чтобы использовать интерфейс, другой класс должен реализовать его, предоставив тело для всех методов, содержащихся в интерфейсе.

Интерфейсы используются главным образом для обеспечения уровня абстракции для вашего кода. Они отделяют реализацию от объявления метода.

Давайте возьмем пример нашей химической компании. Предположим, что мы должны предоставить скидку Премиум и Обычным клиентам, и скидки для обоих будут различны.

Мы создадим интерфейс под названием 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;
   }
}

Когда вы реализуете Интерфейс, то обязательно нужно реализовать метод этого Интерфейса. Если вы не реализуете методы интерфейса, он выдаст ошибку. Вы должны использовать интерфейсы, если хотите сделать реализацию метода обязательной для разработчика.

Стандартный интерфейс Salesforce для Batch Apex

SFDC имеет стандартные интерфейсы, такие как Database.Batchable, Schedulable и т. Д. Например, если вы реализуете интерфейс Database.Batchable, вы должны реализовать три метода, определенных в интерфейсе — Start, Execute и Finish.

Ниже приведен пример стандартного Salesforce, предоставляемого интерфейса Database.Batchable, который рассылает электронные письма пользователям со статусом пакета. Этот интерфейс имеет 3 метода, Start, Execute и Finish. Используя этот интерфейс, мы можем реализовать функциональность Batchable, а также предоставляет переменную BatchableContext, которую мы можем использовать для получения дополнительной информации о выполняемом пакете и других функциях.

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

   // 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('test@test.com');
      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);
   }
}

Чтобы выполнить этот класс, вы должны запустить приведенный ниже код в консоли разработчика.