请问您为什么要这样做?
我问是因为可能有一种更清洁的方法来实现您想要做的事情。
多态性旨在减少使用此类 if 语句的代码。
你考虑过这样的事情吗?
- 构建一个简单的抽象类
public abstract Lease {
public Id recordId { get; private set; }
public Lease(Id recordId) {
this.recordId = recordId;
}
public Date getGreatestMRIVacateDate() {
return Database.Query( getHighestQuery() )
}
private String getHighestQuery() {
return 'SELECT
Id,
Greatest_MRI_Vacate_Date__c
FROM Lease__c
WHERE ' + getObjectIdField() + ' =:recordId';
}
protected abstract String getObjectIdField();
}
- 为您的用例扩展类
public Property extends Lease {
public Property(Id recordId) {
super(recordId);
}
private override String getObjectIdField() {
return 'Property__c';
}
}
public Account extends Lease {
public Account(Id recordId) {
super(recordId);
}
private override String getObjectIdField() {
return 'Account__c';
}
}
- 创建工厂类
public class LeaseFactory {
public class TypeException extends Exception();
public static Lease getLease(Id recordId) {
String objType = getSObjectType(recordId);
switch on objType {
when 'Property__c' {
return new Property(recordId);
}
when 'Account__c' {
return new Account(recordId);
}
when else {
throw new TypeException('Unknown Type: ' + recordId);
}
}
}
private static String getSObjectType(Id recordId) {
return Id.valueOf(recordId).getSObjectType().getDescribe().getName();
}
}
- 现在您可以在代码中动态而干净地使用它
List<Id> recordIds;
for (Id recordId : recordIds) {
Lease l = LeaseFactory.getLease(recordId);
System.debug( l.getGreatestMRIVacateDate() );
}
这可能看起来设计过度(并且可能有一种方法可以使它更简洁),但这种方法的优点是,如果您决定添加更多功能,例如 getLowestMRIVacateDate,您只需要一次编辑代码地点:租赁类。然后,该功能将过滤到您的其余类。
这减少了您必须执行该 if 语句的次数,该语句确定它是哪种类型,而不是潜在地必须在每个方法中执行它。从长远来看,它使代码更简洁、更短且更易于遵循。
请注意,我很确定还有一种更简洁的方式仍在使用界面,但我很累,现在不想弄清楚。我建议看这个:
https://www.youtube.com/watch?v=NU_1StN5Tkk
另一方面,如果您只有这种方法,您是否考虑过 SOSL 而不是 SOQL?
我不是很精通它,但我相信您可以按照以下方式做一些事情:
FIND :recordId IN (Account__c, Property__c) RETURNING Lease(Id, Greatest_MRI_Vacate_Date__c)
见:https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_sosl_find.htm