Salesforce(SFDC) - 公共,静态,全局关键字 - 为整个班级使用一个列表?

时间:2012-10-22 23:02:46

标签: salesforce apex-code static-methods public visualforce

我很难理解使用公​​共,静态和全局关键字和我的变量和方法。

以下是我的代码片段。我正在尝试做的是页面加载,在我的构造函数中创建一组用户有权访问的accountID(8-33这是有效的)。此集将用于过滤后续方法中使用的查询。

我发现公共pageReference runSearch()可以访问'terrAccSet',但公共静态List getsearchAccounts无法访问它。

如果我将其更改为public static Set terrAccSet,我不会在system.debugs中获取任何数据 - 我该怎么办?

global with sharing class MyClass {

    public static List<FRM_Metrics_gne__c> accountSearchGmap {get; set;}
    public Set<Id> terrAccSet;
    public List<String> terrIdList;

//Constructor
public MyClass() {

    terrAccSet = new Set<Id>();
    terrIdList = new List<String>();
    Set<Id> grpIdSet = new Set<Id>();

    Id uid = '00570000001R95e'; //member of TWO territories
    //UserTerritory Utid =  [SELECT TerritoryId FROM UserTerritory where UserId = :userInfo.getUserId()];

    List<UserTerritory> Utid =  [SELECT TerritoryId FROM UserTerritory where UserId =: uid ];
    for(UserTerritory usrTerr: Utid){
        terrIdList.add(usrTerr.TerritoryId);
    }

    List<Group> grp = [Select Id from Group where RelatedID IN :terrIdList];
    for (Group eachgroupd : grp ){
        grpIdset.add(eachgroupd.Id);
    }

    List<AccountShare> accountidList = [SELECT AccountId,UserOrGroupId FROM AccountShare where UserOrGroupId in :grpIdset];
    //all accounst that the user has access according to territory hiearchy
    for(AccountShare eachas:accountidList ){
        terrAccSet.add(eachas.AccountId);
    }

}

public PageReference runSearch() {
    //Has Data
    system.debug('**terrAccSet runSearch**   '+terrAccSet);
}  

public static List<Custom_Object__c> getsearchAccounts(String multiSearchString) {
    //terrAccSet variable is missing
    system.debug('**terrAccSet getSearchAccounts**   '+terrAccSet);
        //logic
        return accountSearchGmap;
}

}

1 个答案:

答案 0 :(得分:2)

  

以下是我的代码片段。我正在尝试做的是页面加载,在我的构造函数中创建一组用户有权访问的accountID(8-33这是有效的)。此集将用于过滤后续方法中使用的查询。

此集应该是实例属性,而不是静态。 如果要创建不影响控制器或类状态的方法,请使用static,例如。文本解析器 - 文本输出中的文本。

如果你想创建一个包并让你的类在你的包之外可用,那么你应该创建Global类,以便其他Apex代码可以调用它,或者你的类将创建要暴露的webService或REST方法。

Public应该用于向将使用属性的VisualForce页面公开属性。否则,使用私有方法和属性进行控制器端处理。

  

public static List getsearchAccounts(String multiSearchString){       //缺少terrAccSet变量       system.debug(' terrAccSet getSearchAccounts '+ terrAccSet);           //逻辑           return accountSearchGmap;   }

此方法不应该是静态的,因为它访问实例属性(它读取状态)。

简单的经验法则,如果它是一个visualforce页面+控制器,你不需要任何静态来执行查询数据库和将数据返回页面的正常工作。