Salesforce (SFDC) — общедоступные, статические, глобальные ключевые слова — использовать один список для всего класса?

У меня плохое понимание использования общедоступных, статических и глобальных ключевых слов с моими переменными и методами.

Ниже приведен фрагмент моего кода. Что я пытаюсь сделать, так это при загрузке страницы в моем конструкторе создать набор идентификаторов учетных записей, к которым у пользователя есть доступ (8-33, это работает). Этот набор будет использоваться для фильтрации запросов, используемых в последующих методах.

Я обнаружил, что публичный pageReference runSearch() имеет доступ к 'terrAccSet', но общедоступный статический список getsearchAccounts не имеет к нему доступа.

Если я изменю его на общедоступный статический Set terrAccSet, я не получу данные ни в одном из системных отладочных файлов - что я могу сделать?

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;
}

}


person tsalb    schedule 22.10.2012    source источник
comment
Меня немного смущает необходимость иметь статический метод в вашем классе контроллера для изменения переменной экземпляра. Единственное, что я могу придумать, что позволит вам сохранить этот статический метод, это сделать terrAccSet статическим и просто получить доступ к этой переменной через статический класс, такой как MyClass.terrAccSet.   -  person John De Santiago    schedule 23.10.2012
comment
Мне тоже не нравится статика в контроллере. Просто удалите статические данные из метода getsearchAccounts.   -  person Andrii Muzychuk    schedule 24.10.2012


Ответы (1)


Ниже приведен фрагмент моего кода. Что я пытаюсь сделать, так это при загрузке страницы в моем конструкторе создать набор идентификаторов учетных записей, к которым у пользователя есть доступ (8-33, это работает). Этот набор будет использоваться для фильтрации запросов, используемых в последующих методах.

Этот набор должен быть свойством экземпляра, а не статическим. Используйте static, если вы хотите создать метод, который не влияет на состояние контроллера или класса, например. текстовый парсер-текст в тексте.

Вы должны сделать класс глобальным, если хотите создать пакет и сделать свой класс доступным за пределами вашего пакета, чтобы другой код Apex мог его вызывать, или если ваш класс создаст методы webService или REST для предоставления доступа.

Public следует использовать для предоставления свойств страницам VisualForce, которые будут использовать свойства. В противном случае используйте частные методы и свойства только для обработки на стороне контроллера.

public static List getsearchAccounts(String multiSearchString) { // отсутствует переменная terrAccSet system.debug('terrAccSet getSearchAccounts '+terrAccSet); //логика возврата accountSearchGmap; }

Этот метод не должен быть статическим, поскольку он обращается к свойству экземпляра (он считывает состояние).

Простое эмпирическое правило: если это страница Visualforce + контроллер, вам не нужно ничего статического для выполнения вашей обычной работы по запросу базы данных и возврату данных на страницу.

person Gerard Sexton    schedule 23.10.2012