2016-03-02 4 views
1

У меня есть ситуация, когда объекты моего агента содержат огромное количество данных, включая графику, физику, а теперь и ай.Java: Resizable Arraylists не будут оставаться параллельными

Я ранее кодировал компоненты этих «агентов» в отдельных объектах, которые были параллельными. Теперь я понимаю, так как агенты содержатся в повторно значимом ArrayList, что если один из агентов уничтожен, индексы больше не будут параллельны компонентам ai.

По правде говоря, класс агента уже имеет длину 10 страниц, и очень разумно содержать методы и данные ai в отдельном объекте. Одна из проблем заключается в том, что методы будут «воспроизведены» в некотором смысле, потому что вместо того, чтобы иметь один объект ai, который будет принимать и обрабатывать данные от многих агентов, мне нужен один объект ai для каждого объекта агента.

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

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

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

Есть ли лучший способ решить эту проблему «параллельного несоответствия».

Редактировать >>>
Я знаю, что могу заполнить все данные в классе агентов. То, чему меня учили, имеет 30-страничный класс - пример плохой структуры.

Вопрос: как я могу создать/reference/для хранения в классе агента, сохраняя все данные ai, инкапсулированные в модуль ai.

Edit >> Пример

public class Agent{ 

    //pseudo code that represents what I need (yes the class declaration order is wrong) 
    AI_ref = new Reference(ai_module); 
    Graphics_ref = new Reference(graphics_module); 

    int[][] physics_data; //Like I said, 10 pages of this 

    void method1(){} 
    void method2(){} 
    //.... 

    } 

    public class graphics_module{ 

    int[][] graphics_data; //this is also about 10 pages 

    void method1(){} 
    void method2(){} 
    //.... 

    } 

    public class ai_module{ 

    int[][] ai_data; //this will likely span 5ish pages 

    void method1(){} 
    void method2(){} 
    //.... 

    } 

} 
+2

Одна большая концепция ООП заключается в том, что все состояние/данные объекта инкапсулируются внутри объекта (в отличие от распространения во внешних структурах данных, таких как ваши аррайалисты). Таким образом, им становится легче управлять ими как единицей. Поэтому я бы сказал, что ваш план, чтобы Агент содержал все необходимые ему данные, звучит как хорошая идея. – Thilo

+0

@Thilo Еще один аспект ООП - это модульность. У меня нет проблем с сохранением ссылок на все данные в объекте агента, но наличие 30-страничного класса определенно/не соответствует/хорошему. Мне нужны указатели, а java их не поддерживает. – bigcodeszzer

+0

Объекты могут быть составлены из других объектов. Это позволяет избежать 30 классов страниц. Объекты в Java разделяются с использованием ссылок. Вероятно, это то, что вы подразумеваете под «указателями». – Thilo

ответ

1

Для создания ссылки, попробуйте

public class Agent{ 

//pseudo code that represents what I need (yes the class declaration order is wrong) 
    ai_module AI_ref = new ai_module(); 
    graphics_module Graphics_ref = new graphics_module(); 

    int[][] physics_data; //Like I said, 10 pages of this 

    void method1(){} 
    void method2(){} 
    //.... 

} 

Как для параллельных массивов, ваш пример не реально обеспечить достаточно подробно, чтобы продемонстрировать, что вы пытаетесь сделать.

//pseudo code that represents what I need (yes the class declaration order is wrong) 

ли вы имеете в виду определение Agent перед определением ai_module и graphics_module не так? Это не. У java-компилятора это не проблема.

Возможно, вам следует изучить основной учебник по java. Я думаю, что он затронет многие ваши проблемы.

+0

Я пытаюсь сделать вторую ссылку на уже существующий объект. – bigcodeszzer

+0

В очень простом и прямом сравнении я пытаюсь создать синтаксис указателя с Java. – bigcodeszzer

4

Параллельных массивы являются 196ой конструкцией разработана при Basic и Fortran были современными языками. На этих языках не было других структур данных.

С 1990-х годов с разработкой OO, если у вас есть несколько разных типов данных, которые принадлежат друг другу, вы создаете объект для хранения ссылок на эти биты данных, так что вам не нужно беспокоиться о параллельности чего-либо.

Я настоятельно рекомендую вам реорганизовать ваш код на современные передовые методы и использовать объекты. Поскольку вы не указали никаких явных сведений, речь идет о наиболее явном ответе, который может быть задан.

+0

Еще один аспект ООП - это модульность. У меня нет проблем с сохранением ссылок на все данные в объекте агента, но наличие 30-страничного класса определенно/не соответствует/хорошему. Мне нужны указатели, а java их не поддерживает. – bigcodeszzer

+2

Вам _think_ вам нужны указатели, а вы _think_ Java их не поддерживают. Оба эти утверждения на самом деле не соответствуют действительности. Они называются _references_ в Java, а класс Java может содержать ссылки на объекты других классов. Кроме того, вам не нужно писать 30-страничный класс, если вы сделаете это правильно. –

+0

Каков мой вопрос ... как вы это делаете? – bigcodeszzer