Проблемная часть
Проблема здесь заключается в поведении функций getName()
типов AnyLogic.
Я пытался использовать тип TargetLine (наследующий getName()
от com.anylogic.engine.markup.AbstractMarkup
), но также и RectangularShape (наследующий getName()
от com.anylogic.engine.presentation.Shape
), и они оба вели себя одинаково.
Документация AnyLogic объясняет getName()
из Shape
следующим образом:
getName (): если форма объявлена как поле в классе презентабельного объекта (агент или эксперимент), например, если онбыл нарисован в графическом редакторе, возвращает имя поля, в противном случае возвращает строку UNKNOWN_NAME.
Объяснение для TargetLine
s getName()
аналогично.
неожиданное поведение
Когда вы присваиваете экземпляр TargetLine
или RectangularShape
или экземпляры других определенных классов AnyLogic переменной AnyLogic (!) (имеется в виду переменная, которая графически определена на холсте), результатиз getName()
изменится с имени, которое было определено в графическом редакторе в свойствах этого экземпляра, на имя переменной, которой он был назначен.С этого момента вы можете больше не получать первоначально определенное имя, так как оно было внутренне изменено на имя переменной.Однако экземпляр остается прежним, изменилось только возвращаемое значение функции getName()
.
Вот пример поведения:
traceln(rectangle.getName()); //prints "rectangle"
myRectangle = rectangle; //assign to AnyLogic Variable
traceln(rectangle.getName()); //prints "myRectangle"
Это объясняет, почему ваше лямбда-выражение (но также и простой цикл, использующий функцию getName()
) не будет работать должным образом после того, как вы присвоили членам списка, который вы ищете, по их имени переменную AnyLogic.
Возможные обходные пути
- не присваивание искомых объектов переменным AnyLogic (вы можете использовать обычные переменные Java, что отлично работает)
- отслеживание сопряжения имя-экземплярсамостоятельно, храня эту информацию в Java Map или аналогичной и получая доступ к этому ресурсу при поиске экземпляров по имени
Заключение
Подводя итог, можно сказать, что ДОЛЖНА СОСТОЯНИЯ документации AnyLogicбыть более похожим на это:
getName (): если форма объявлена как поле в классе презентабельного объекта (Agent или Experiment), например, если он был нарисован в графическом редакторе, возвращает имя поля, в противном случае возвращает строку UNKNOWN_NAME.Если форма присваивается переменной AnyLogic (переменная, нарисованная в графическом редакторе), вместо этого возвращается имя этой переменной.Например.после запуска кода myVar = myShape;
, getName()
вернет myVar вместо myShape .