Я столкнулся с проблемой доступа к объектам. Я впервые пытаюсь использовать глобальные переменные в APEX;

У меня есть основной метод @future, который вызывает два метода. В первом методе я хотел бы заполнить значения для карты, которую я буду использовать во втором методе, не возвращая ее (уже возвращая другую карту);

Моя идея состояла в том, чтобы использовать переменную, объявленную глобальной на уровне класса, но это кажется невозможным из-за будущего контекста... Как я мог это сделать? Возврат двух карт из первого метода?

Я нашел эту тему, которая соответствует контексту моей проблемы, однако реального ответа нет.

Класс и глобальная объявленная карта:

global with sharing class AP01_CrecheSiteWeb {
    global Map<Id, List<Account>> mapIdContratToFinalListCreches {get; set;}
    ...

Метод @futur:

    @future
    public static void updateCrecheSiteWeb(List<Id> listCZDTIds) {

    // Call first method - I want it to set another map in order to access it in the 2nd method !
    Map<Id, List<Account>> mapIdContratToListAssociatedCreches = getMapContractToCreches(listCZDTIds);

    try {
        // Call second method, that should use the map set in the 1st method, and of course the map returned by the 1st method
        getMapContractToCrechesSiteWeb(mapIdContratToListAssociatedCreches);
    } catch (Exception ex){
        System.debug('--AP01_CrecheSiteWeb EXCEPTION --' + ex.getMessage());
    }
}

Первый метод (части):

public Map<Id, List<Account>> getMapContractToCreches(List<Id> listCZDTIds) {

      [...] 
     // I want to do something like this :

    Map<Id, List<Account>> getGlobalMap = this.mapIdContratToFinalListCreches;

     [...]

     return anotherMap;
 }

И 2-й метод будет делать то же самое, получить глобальную карту, использовать ее, очистить.

РЕДАКТИРОВАТЬ: так что теперь, может быть, мне следует открыть новую тему, потому что это связано с этим, но не конкретно с контекстом @future (я могу сделать это, если меня попросят)

Как я понял ваш ответ, я мог бы перенести некоторые объекты из одного метода в другой, выполнив что-то вроде

Class testMap {
var A;

meth1(param A) {
    // do something about A
    // don't return A, but i's affected because of referencing passage
}

meth2(paramA) {
    // use A with the value it has after metho 1 is Called
}

}

Но у меня не получается... Я что-то пропустил?

0
Alexis MASSON 7 Авг 2019 в 18:55

1 ответ

Лучший ответ

Преимущество языков ООП заключается в том, что все назначения объектов по своей природе являются ссылками. Таким образом, даже когда они передаются через параметры, изменения в одном методе будут отражаться в другом методе, когда та же ссылка передается в качестве параметра. Чтобы лучше объяснить это, рассмотрим следующий пример:

@future
public static void myFuture(List<Id> accIds){
    Map<Id,List<Contact>> accountsToConsMap = new Map<Id,List<Contact>>();
    met1(accIds, accountsToConsMap);
    met2(accountsToConsMap);
}

public static void met1(List<Id> ids, Map<Id,List<Contact>> accMap){
    List<Account> accs = [SELECT Id, Name, (SELECT Name FROM Contacts) FROM Account];
    for(Account acc: accs) {
        accMap.put(acc.Id, acc.Contacts);
    }
}

public static void met2(Map<Id,List<Contact>> accMap){
    System.debug('contacts map => '+accMap);
}

Здесь accMap действует как ссылка на accountsToConsMap, поэтому, хотя вы измените его в методе met1, его значение также отразится в методе met2.

Вы можете реализовать свою логику таким же образом. Нет необходимости что-либо возвращать в 1-м или 2-м методах. Просто передайте параметры, которые действуют как ссылки, и используйте/обрабатывайте их любым методом.

2
salesforce-sas 2 Авг 2019 в 16:40
2
+1, но обычное сокращение для объектно-ориентированного программирования - «ООП», а не «ООП».
 – 
sfdcfox
2 Авг 2019 в 16:39
Насколько я понял ваш ответ, я мог бы перенести некоторые объекты из одного метода в другой, выполнив что-то вроде Class testMap { var A; вар Б; meth1(param A) { // делаем что-то с A // не возвращаем A, но это влияет на i из-за ссылки на отрывок } meth2(paramA) { // используем A со значением, которое оно имеет после вызова метода 1 } } Но У меня не получается... Я что-то пропустил? EDIT: whaaaa, хорошо, я отредактирую свой вопрос, потому что он там не отформатирован
 – 
Alexis MASSON
7 Авг 2019 в 18:53
1
Понял ваше замешательство. Примитивные типы данных передаются по значению, поэтому это не отражается. но непримитивные типы передаются по ссылке - в вашей ссылке соблюдайте System.debug(c.price);
 – 
salesforce-sas
7 Авг 2019 в 19:18
1
Да, я понял ваш код и эту ссылку :) Я думаю, что мой код должен работать ... Я передаю 3 объекта в своем первом методе, я обрабатываю три из них и возвращаю только один, отладка говорит только список параметр был изменен, как я хочу; я не возвращаю; Я передаю его второму методу в качестве параметра, и его размер равен 0. Это Map... Для меня это выглядит так же, как вы делаете в своем примере !! Я там потерялся (но ваш код помог с концепциями;))
 – 
Alexis MASSON
7 Авг 2019 в 19:26
1
Это новое убивало все! Мне все еще нужно научиться полностью контролировать эти моменты. Но с вашей помощью и моим мозговым штурмом/поиском я многому научился :)
 – 
Alexis MASSON
8 Авг 2019 в 12:13