Java получает только определенные поля объекта

У меня есть POJO, который выглядит так:

public class Task {
    private TaskData taskData;

    String id;
    private int status;
    private int success;
    private int error;
}

class TaskData {
    transient LinkedList<String> list0;
    transient LinkedList<String> list1;
}

списки в TaskData могут быть огромными (более 100 мб).

При получении всех объектов из Map<String, Task> tasksMap = new HashMap() я не хочу, чтобы TaskData поля включались/загружались. Как я могу достичь этого?

P.S. Это не связано с сериализацией.

Обновлять: под "получением всех объектов" я имею в виду, например:

class SomeClass {
   Map<String, Task> tasksMap = new HashMap()

   SomeClass() {
      //...initialize multiple tasks with huge list0, list1..
      // => add them all
      tasksMap.put("abc0", task);
      tasksMap.put("abc1", task);
      tasksMap.put("abc2", task);
      tasksMap.put("abc3", task);
   }

   Map<String, Task> tasksMap getMap() {
      // when i get all the map's objects, i want the received `Task` objects
      // to not have `TaskData` attribute

      return tasksMap;
   }
}

Как загрузить карту tasksMap?

Laksitha Ranasingha 18.02.2019 16:40

Я могу придумать одно решение, реализовать свою собственную карту и переопределить put() и удалить TaskData при вставке в карту.

Santosh 18.02.2019 16:41

Непонятно, о чем вы спрашиваете: что вы подразумеваете под «включено/загружено»?

trylimits 18.02.2019 16:45

также неясно, что он подразумевает под «получением всех объектов из Карта<Строка......

Dylan 18.02.2019 16:46

это не очень важно, как загружается tasksMap. (я полагаю, вы имеете в виду инициализированный?). дело в том, что есть огромные списки в момент, когда я получаю все объекты из tasksMap

user1935987 18.02.2019 18:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
272
2

Ответы 2

Дайте полю значение по умолчанию, равное null, а затем обновите значение позже, используя метод установки.

public class Task {
    private TaskData taskData;

    String id;
    private int status;
    private int success;
    private int error;
}

class TaskData {
    transient LinkedList<String> list0 = null;
    transient LinkedList<String> list1 = null;

    public void setList0(LinkedList<String> list){
        list0 = list;
    }

    public void setList1(LinkedList<String> list){
        list1 = list;
    }
}

конечно, я могу это сделать, но в тот момент, когда мне нужно все tasksMap, я уверен, что списки огромны, а не null

user1935987 18.02.2019 18:22

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

  public Task shallowCopy() {
    Task newTask = new Task();
    newTask.id = id;
    newTask.status = status;
    ...
    return newTask;
  }

тем не менее, когда я запрашиваю все объекты из tasksMap, я полагаю, что все атрибуты (включая огромные списки) этих объектов загружаются

user1935987 18.02.2019 18:23

Другие вопросы по теме