Apex - Giao diện

Một giao diện giống như một lớp Apex trong đó không có phương thức nào được triển khai. Nó chỉ chứa các ký hiệu của phương thức, nhưng phần thân của mỗi phương thức là trống. Để sử dụng một giao diện, một lớp khác phải triển khai nó bằng cách cung cấp một phần thân cho tất cả các phương thức có trong giao diện.

Các giao diện được sử dụng chủ yếu để cung cấp lớp trừu tượng cho mã của bạn. Chúng tách việc triển khai khỏi khai báo phương thức.

Hãy lấy một ví dụ về Công ty Hóa chất của chúng tôi. Giả sử rằng chúng tôi cần cung cấp chiết khấu cho khách hàng Cao cấp và Thông thường và chiết khấu cho cả hai sẽ khác nhau.

Chúng tôi sẽ tạo một Giao diện được gọi là 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;
   }
}

Khi bạn triển khai Giao diện thì bắt buộc phải triển khai phương thức của Giao diện đó. Nếu bạn không triển khai các phương thức Giao diện, nó sẽ xuất hiện một lỗi. Bạn nên sử dụng Interfaces khi muốn bắt buộc nhà phát triển triển khai phương thức.

Giao diện Salesforce Tiêu chuẩn cho Batch Apex

SFDC có các giao diện tiêu chuẩn như Database.Batchable, Schedulable, v.v. Ví dụ: nếu bạn triển khai Giao diện Database.Batchable, thì bạn phải triển khai ba phương thức được xác định trong Giao diện - Bắt đầu, Thực thi và Kết thúc.

Dưới đây là một ví dụ cho Giao diện Cơ sở dữ liệu được cung cấp bởi Standard Salesforce, giao diện này sẽ gửi email cho người dùng với Trạng thái hàng loạt. Giao diện này có 3 phương thức là Start, Execute và Finish. Sử dụng giao diện này, chúng ta có thể triển khai chức năng Batchable và nó cũng cung cấp biến BatchableContext mà chúng ta có thể sử dụng để có thêm thông tin về Batch đang thực thi và thực hiện các chức năng khác.

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

Để thực thi lớp này, bạn phải chạy đoạn mã dưới đây trong Bảng điều khiển dành cho nhà phát triển.

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