【问题标题】:What is the proper method include an inner class in apex?在 apex 中包含内部类的正确方法是什么?
【发布时间】:2012-08-02 01:41:26
【问题描述】:

我正在创建一个类,该类最终将使用批处理 APEX 按计划更新记录。我在编写内部类时遇到了麻烦,并且尝试了我能想到的所有可能的语法组合。

代码:

public with sharing class AddendumsExpired {

    public List<Id> opportunityIds{get;set;}
    public List<Id> addendumIds{get;set;}

    public List<Id> OppIds(){

        for(Opportunity thisOpp :[SELECT Id,StageName,Name,Addendum_Amount__c,Addendum_Amount_No_Discounts__c,Agreement_Balance__c FROM Opportunity WHERE (NOT StageName LIKE '%Proposed%') AND (NOT StageName LIKE '%Accepted%')]){
            opportunityIds.add(thisOpp.Id);
        }

        return opportunityIds;
    }

    public List<Id> AddIds(){

        for(Addendum__c thisAdd :[SELECT Id FROM Addendum__c WHERE Opportunity__c IN :opportunityIds AND Expiration__c < TODAY]){
            addendumIds.add(thisAdd.Id);
        }

        return addendumIds;
    }

    public class debugging {
        system.debug('opportunityIds :: '+opportunityIds);
        system.debug('addendumIds :: '+addendumIds);
        system.debug('OppIds() :: '+OppIds());
        system.debug('AddIds() :: '+AddIds());
    }
}

我仍处于测试阶段,debugging 类正在抛出错误。我需要为最终的生产部署提供多个内部类。

我之前使用过上面的语法 (public class classname {),没有任何问题。但是,当我执行匿名此代码块时,我收到错误:

Compile error at line 24 column 8
unexpected token: 'class'

如果有人能对这种情况有所了解,我将不胜感激!我很困惑,想知道为什么这种语法可以在其他十几个类中工作,但不是这个。

【问题讨论】:

    标签: class salesforce apex-code


    【解决方案1】:

    你班上的代码:

    public class debugging {
            system.debug('opportunityIds :: '+opportunityIds);
            system.debug('addendumIds :: '+addendumIds);
            system.debug('OppIds() :: '+OppIds());
            system.debug('AddIds() :: '+AddIds());
        }
    

    错误地放置在声明部分,而不是任何实际代码应该放置的位置(不包括静态、getter 和 setter)。

    将 system.debug 代码放在内部类(可能是构造函数)内的方法中,它会编译并运行得很好。当然,你需要先实例化你的调试类,这样它就有一个实例来执行它包含的代码。

    像这样:

    public class Debugging 
    {
       public Debugging(List<Id> opportunityIds)
       {
          system.debug('opportunityIds :: '+opportunityIds);
       }
    }
    

    然后你可以创建一个实例来执行这些调试语句,将你的机会ID列表传递给你的内部类的构造函数:

    Debugging d = new Debugging(opportunityIds);
    

    编辑:

    将您的 getter 和 setter 更改为以下内容。这些包含您列表的正确初始化代码(使用 retVal 在每个列表中声明一个新列表):

    public List<Id> opportunityIds
    {
       get
       {
          List<Id> retVal = new List<Id>();
          for(Opportunity thisOpp :[SELECT Id,StageName,Name FROM Opportunity WHERE (NOT StageName LIKE '%Proposed%') AND (NOT StageName LIKE '%Accepted%')])
          {
             opportunityIds.add(thisOpp.Id);
          }
          return retVal;
       }
       private set;
    }
    
    public List<Id> addendumIds
    {
       get
       {
          List<Id> retVal = new List<Id>();
          for(Addendum__c thisAdd :[SELECT Id FROM Addendum__c WHERE Opportunity__c IN :opportunityIds AND Expiration__c < TODAY])
          {
             addendumIds.add(thisAdd.Id);
          }
          return retVal;
       }
       private set;
    }
    

    【讨论】:

    • 感谢您的回答,亚当,我仍然遇到unexpected token: 'class' 的问题。无论我在public class Debugging 中放置什么,仍然会引发错误。我可以让它完全空着,错误仍然会出现。有什么想法吗?
    • 我发布的代码保存并在我的测试组织中完美运行(除了我需要更改第二个 getter 中的对象,因为我没有可使用的 Addendum__c 对象)。因此,如果代码仍然不适合您,我会在 Eclipse 中创建一个新项目,然后在必要时使用相同的代码创建一个全新的类 - 因为您现有的文件/项目可能已损坏。隐藏字符或非标准 ASCII 也可能导致此问题,例如当您复制和粘贴包含特殊字符的代码时。
    • 经典 Eclipse。我不知道为什么我没有早点尝试。我创建了一个新项目并复制了代码,它运行得很好。感谢您的帮助!
    • 没问题。我实际上不得不说服人们这甚至是可能的。如有疑问 - 新项目!
    • 我希望开发者控制台可以部署包。如果是这样,我会进行切换。只是还没有完成。
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2021-03-21
    • 2019-07-28
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多