Функция одного геттера для нескольких / всех переменных / коллекций - PullRequest
0 голосов
/ 04 сентября 2018

Можно ли построить функцию, которая принимает любую строку и возвращает соответствующую переменную / коллекцию? У меня есть около 54 частных коллекций в одном классе, которые мне нужно прочитать из другого класса. Названия необходимых коллекций известны. Самым простым способом было бы сделать каждую коллекцию общедоступной, но я предполагаю, что была причина, по которой первоначальный создатель установил ее как частную. Поскольку их так много, я слишком ленив, чтобы получить к ним доступ через выделенные геттеры или используя функцию переключения.

Edit: я не использую обычную среду разработки Java с графическим интерфейсом. Я работаю с программным обеспечением AnyLogic, в котором нет меню для создания геттеров / сеттеров.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018
  1. a) В AnyLogic есть специальная функция для этой цели:
    executeExpression( Class<T> returnType, String code )
    Для доступа к любой коллекции вы можете использовать такой код:
    executeExpression( List.class, "collectionName" ).get( 0 )

    b) Функция работает только с открытыми переменными, поэтому, если вы определили Коллекции, как общедоступные, вы сможете использовать функцию.

  2. В случае, если коллекции объявлены как параметры агента, вы можете получить доступ к ним аналогичным образом с помощью функции getParameter(java.lang.String name)

  3. Методы получения и установки можно создавать в Eclipse, просто скопируйте и вставьте код класса в Eclipe, сгенерируйте их и скопируйте и вставьте код обратно в код класса AnyLogic.
0 голосов
/ 05 сентября 2018

Если у вас есть 54 коллекции в классе AnyLogic, вам действительно следует рассмотреть возможность рефакторинга вашей базовой структуры. Несколько альтернатив:

  • Рассмотрим массив коллекций (или коллекцию коллекций). Если вы устанавливаете константы (static final int), вы можете легко сказать arrayCollection [CONSTANT]. Например, это может быть arrayWidgetsInProgess [PRODUCT_A], чтобы получить коллекцию виджетов типа product A.
  • Рассмотрим только одну коллекцию и использование лямбда-выражений для получения интересующих вас объектов на лету. В AnyLogic это может быть фильтр (collection, agent -> agent.attribute == attributeWeWant).

Единственный раз, когда я действительно нуждался в таком количестве коллекций, это может быть случай, когда пользователь может что-то определять через интерфейс. Например, если у меня есть модель, в которой типы продуктов полностью определены пользователем, они могут иметь 10 или 100 типов продуктов. В этом случае я бы использовал коллекцию коллекций или массив или коллекции. Коллекция коллекций может быть arrayList из arrayLists, hashMap из arrayList, hashMap из hashMaps ...

Вы должны быть готовы к созданию экземпляра коллекции коллекций / массивов коллекций при запуске класса или в другом коде. Холст AnyLogic позволит вам создать массив коллекций, но затем вам нужно будет на самом деле создать экземпляр этих коллекций в массиве.

0 голосов
/ 04 сентября 2018

Короткий ответ

Хватит ленивиться и создавать сеттеров. Каждая среда разработки Java с графическим интерфейсом поддерживает эту операцию в меню.

Все еще ленивый

Используйте отражение, чтобы получить доступ к классу и получить личное поле по имени. Попробуйте прочитать страницу Java Class JavaDoc .

Google с радостью предоставит примеры кода с использованием отражения. Параметры поиска включают в себя, но не ограничиваются: «Учебник по Java-отражению» и «Пример Java-отражения».

...