Apex - Interfaces
Uma interface é como uma classe Apex na qual nenhum dos métodos foi implementado. Ele contém apenas as assinaturas do método, mas o corpo de cada método está vazio. Para usar uma interface, outra classe deve implementá-la fornecendo um corpo para todos os métodos contidos na interface.
As interfaces são usadas principalmente para fornecer a camada de abstração para seu código. Eles separam a implementação da declaração do método.
Vamos dar um exemplo de nossa empresa química. Suponha que precisemos fornecer o desconto para clientes Premium e Ordinários e os descontos para ambos serão diferentes.
Vamos criar uma interface chamada de 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;
}
}
Quando você implementa a Interface, é obrigatório implementar o método dessa Interface. Se você não implementar os métodos de interface, ocorrerá um erro. Você deve usar Interfaces quando quiser tornar a implementação do método obrigatória para o desenvolvedor.
Interface Salesforce padrão para Batch Apex
SFDC tem interfaces padrão como Database.Batchable, Schedulable, etc. Por exemplo, se você implementar a Interface Database.Batchable, deverá implementar os três métodos definidos na Interface - Iniciar, Executar e Concluir.
Abaixo está um exemplo para a Interface Database.Batchable fornecida pelo Salesforce padrão que envia e-mails para usuários com o Status do lote. Esta interface possui 3 métodos: Iniciar, Executar e Concluir. Usando esta interface, podemos implementar a funcionalidade Batchable e também fornece a variável BatchableContext que podemos usar para obter mais informações sobre o Batch que está em execução e para realizar outras funcionalidades.
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);
}
}
Para executar esta classe, você deve executar o código abaixo no console do desenvolvedor.
CustomerProessingBatch objBatch = new CustomerProessingBatch ();
Database.executeBatch(objBatch);