To address this issue, it seems that setting up a global constant accessible to all Apex classes would be hugely valuable in making sure that picklist values and record types (and other items) are consistently referenced in Apex.
For example, if I'm trying to set the Status of a Contract to "Activated", I could write the code as follows:
myContract.Status = 'Activated';
This is great if it's the only place I ever deal with the Contract Status field. But what're the chances of that? Instead, how about writing the code as follows?
myContract.Status = ContractUtil.ACTIVATED_STATUS;
Now I don't need to worry about all the myriad places where I've hardcoded the status value. If I ever need to change the status, I can update the constant in
ContractUtil
or look for all references to ContractUtil.ACTIVATED_STATUS
.Here's the sample code for a generic SObject utility class:
/** * Utility class with supporting methods for * a SalesforceSObject
. * * Examples of supporting methods include getting * a Record Type ID, getting an expected picklist * value for a particular field, and conversion * to/from other objects. */ public class GenericSObjectUtil { /** * TheString
value that * represents an activated status, which goes * into the Status field. */ public static final String ACTIVATED_STATUS = 'Activated'; /** * The expected default Record Type Name * for all users. */ public static final String DEFAULT_RECORD_TYPE_NAME = 'This SObject'; /** * TheString
value that * represents a draft status, which goes * into the Status field. */ public static final String DRAFT_STATUS = 'Draft'; /** * The map ofRecordTypeInfo
* objects retrieved by describing the * SObject, keyed by the Record Type Name. * * This is stored to make *getRecordTypeId
method calls * more efficient. */ private static final MaprecordTypeInfosByName = Schema.SObjectType.Contract.getRecordTypeInfosByName(); /** * Retrieve the Record Type ID based on a * given Record Type Name. If no match is * found, then return null. * * @param name The name of the Record Type * @return The ID of the Record Type, * if found; null otherwise. */ public static Id getRecordTypeId(String name) { return recordTypeInfosByName.get(name).getRecordTypeId(); } // public static Id getRecordTypeId(String) } // public class GenericSObjectUtil
Note: I know the above code may be cut off a bit due to width limits in Blogger, but you should be able to copy and paste the code into a text editor to see the full structure if necessary.
What do you think? Feedback on this implementation or other solutions will be appreciated!