探索Salesforce Apex内部函数改变外部函数变量的值

本文探讨了在模块化代码过程中,如何在内部函数中改变外部函数的变量值。通过具体示例,分析了在Java中,哪些类型的变量可以通过内部函数成功修改,以及为何某些变量无法被改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言】:我们在为方便写测试类而模块化代码时,经常会将一个逻辑很长的函数,拆分成几大块,以防写测试类时复杂的逻辑进不去,而影响部署效率。所以在模块化函数时,通常会碰上内部函数改变外部函数变量值的问题。

代码示例】: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())

如果有,那么只要我们通过这种函数来修改对象的值(而不是直接用等号之类),那是可以实现我们的目标的。
如果没有,那就没戏。

参考】:小问题笔记之一:在java的函数中改变外部变量的值 [问题点数:0分]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值