📜  Apex-接口

📅  最后修改于: 2020-11-05 03:13:18             🧑  作者: Mango


接口就像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;
   }
}

在实现接口时,必须实现该接口的方法。如果不实现Interface方法,则将引发错误。要使开发人员必须强制执行方法时,应使用接口。

用于批处理Apex的标准Salesforce接口

SFDC确实具有标准接口,例如Database.Batchable,Schedulable等。例如,如果实现Database.Batchable接口,则必须实现接口中定义的三种方法-Start,Execute和Finish。

以下是Standard Salesforce提供的Database.Batchable接口的示例,该接口向具有批处理状态的用户发送电子邮件。该界面有3种方法,开始,执行和完成。使用此接口,我们可以实现Batchable功能,并且还提供BatchableContext变量,我们可以使用该变量获取有关正在执行的Batch的更多信息并执行其他功能。

global class CustomerProessingBatch implements Database.Batchable,
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 scope) {
      List customerList = new List();
      List updtaedCustomerList = new List();
      
      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);
   }
}

要执行此类,您必须在开发者控制台中运行以下代码。

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