Извините за слегка сумасшедшую формулировку этого вопроса, но я очень новичок в мышлении, ориентированном на агентов (это эти «шаблоны»?) И только немного менее новый для java, и я борюсь с тем, что кажется очень основная проблема.Java: Как объект «агент», находящийся внутри объекта «мир», получает информацию о «мире»?
Я делаю много этого «интуитивно» (т.е. слепо), а не пытаюсь понять чужой код - отчасти потому, что я изо всех сил пытаюсь понять код, который «выше моего уровня», но также потому, что я надеюсь, мой путь "поможет мне оценить правильный путь позже.
В принципе, я моделирую агент (вакуум робота) в среде (дом). Дом содержит коллекцию (HashMap) номеров. У дома есть метод getRoom(int key)
, который возвращает комнату, соответствующую данному ключу. Агент имеет государство, которое на этом этапе отслеживает идентификатор комнаты (который также является ключом в Доме), который является комнатой, в которой робот «находится» для целей навигации по миру; государство также описывает, является ли помещение грязным. Когда агент сконструирован, он инициализируется идентификатором (он должен быть создан «в комнате»), но ему не дается грязный/чистый статус комнаты. Я хочу, чтобы агент проверял наличие грязи - это связано с использованием метода getRoom()
в Доме. Однако с Java, который я изучил до сих пор, я не знаю, как это сделать. Я знаю, что могу получить доступ к этому методу, создав House внутри java или сделав метод статическим, но это не сработает - агент должен знать о доме SPECIFIC, который находится в памяти, тот, который был инициализирован с помощью комнат ,
tl; dr: Как объект-агент может получить ссылку на объект, который хранится в HashMap внутри другого объекта среды?
PS Здесь представлена моя воображаемая модель для перспективы «более высокого уровня», поддерживаемая этим подходом: Я как бы интуитивно хотел, чтобы Агент полностью отвечал за свои собственные заповеди и поведение, так что код выше выглядел бы более как:
agent.percieve() //agent checks the room it thinks its in for dirt and exits
if (agent.gotDirt()) agent.clean() //agent activates its cleaning device if it found dirt in this room
if (agent.gotDirt() == false) agent.move() //agent picks an exit and leaves the room
Я понимаю, что один подход будет делать логику об обновлении состояния Агента и моделирования действий агента , в другом слое, например World или Game, который создает объект House и объект Agent и, следовательно, имеет прямой доступ к обоим. Я, вероятно, в конечном итоге сделаю это, но я искал, есть ли другой способ. – Toadfish
Первый ответ работает блестяще для моего случая, но [этот вопрос] (http://stackoverflow.com/questions/40480/is- java-pass-by-reference-or-pass-by-value) многое помогли с точки зрения моего реального понимания дилеммы pass-by-reference и pass-by-value, которая здесь начинается. Один из лучших ответов на этот вопрос ссылается [эта статья] (http://javadude.com/articles/passbyvalue.htm), что помогло еще больше. Если кто-то как-то попал сюда, пытаясь решить аналогичную проблему, в которой релевантная посылка и пропускная способность важны, эти ресурсы должны оказаться неоценимыми. – Toadfish