【前言】:我们在为方便写测试类而模块化代码时,经常会将一个逻辑很长的函数,拆分成几大块,以防写测试类时复杂的逻辑进不去,而影响部署效率。所以在模块化函数时,通常会碰上内部函数改变外部函数变量值的问题。
【代码示例】:testFactory里面的mainFun调用了subFun,用以改变mainFun变量count, aList, bMap值。
public class testFactory {
public static void mainFun(Map<String, String> aMap) {
Integer count = 0;
List<String> aList = new List<String>();
Map<String, String> bMap = new Map<String, String> {
'1' => 'a',
'2' => 'b',
'3' => 'c',
'4' => 'd',
'5' => 'e'
};
for(String a : aMap.keySet())
subFun(aList, bMap, a, count);
System.debug(LoggingLevel.INFO, '*** count: ' + count);
System.debug(LoggingLevel.INFO, '*** aList: ' + aList);
System.debug(LoggingLevel.INFO, '*** bMap: ' + bMap);
}
public static void subFun(List<String> aList, Map<String, String> bMap, String a, Integer count) {
count++;
aList.add(a);
bMap.remove(a);
}
}
【测试】:我们通过传进去的aMap来验证debug的结果。
Map<String, String> aMap = new Map<String, String> {
'1' => 'a',
'2' => 'b',
'3' => 'c'
};
testFactory.mainFun(aMap);
【结果】:最终我们发现aList和bMap实现了值的改变,而count并没变。
39.0 APEX_CODE,DEBUG;APEX_PROFILING,INFO;CALLOUT,INFO;DB,INFO;VALIDATION,INFO;WORKFLOW,INFO
Execute Anonymous: Map<String, String> aMap = new Map<String, String> {
Execute Anonymous: '1' => 'a',
Execute Anonymous: '2' => 'b',
Execute Anonymous: '3' => 'c'
Execute Anonymous: };
Execute Anonymous:
Execute Anonymous: testFactory.mainFun(aMap);
21:11:33.443 (443641232)|EXECUTION_STARTED
21:11:33.443 (443650227)|CODE_UNIT_STARTED|[EXTERNAL]|execute_anonymous_apex
21:11:33.443 (488543290)|USER_DEBUG|[16]|INFO|*** count: 0
21:11:33.443 (488626789)|USER_DEBUG|[17]|INFO|*** aList: (1, 2, 3)
21:11:33.443 (488666573)|USER_DEBUG|[18]|INFO|*** bMap: {4=d, 5=e}
...
21:11:33.443 (488766986)|CODE_UNIT_FINISHED|execute_anonymous_apex
21:11:33.443 (491675148)|EXECUTION_FINISHED
【结论】:
变量值会不会被改变,取决于变量本身有没有用来设置自己值的函数,例如A.SetValue()之类的(请注意我说的是通过函数赋值而不是直接通过等号赋值,这个差别很重要)。(或者对象允许成员变量直接被外界赋值,如A.Value=xxx 那也是可以的,等同于A.SetValue())
如果有,那么只要我们通过这种函数来修改对象的值(而不是直接用等号之类),那是可以实现我们的目标的。
如果没有,那就没戏。