Набор данных для хранения объектов в Java - PullRequest
4 голосов
/ 01 июля 2011

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

Person ------------ Employee ------------ Sales Engineer       
  |                    |
Customer          Field Engineer

Итак: человек, клиент, сотрудник, менеджер по продажам, полевой инженер.

Мне нужно отслеживать всеэто ... как лучше их хранить?В ArrayList?Пользовательский ArrayList?

Способ их хранения также может повлиять на будущее расширение - в будущем эти объекты могут быть сгенерированы полями из SQL Server.(Кроме того, это приложение для Android - так что это может быть фактором.)

Ответы [ 4 ]

5 голосов
/ 01 июля 2011

Вам понадобится List<Person>.Ваша диаграмма предлагает наследование, поэтому вы захотите иметь коллекцию суперкласса и позволить полиморфизму делать все остальное.

Ваш код может сделать это:

List<Person> people = new ArrayList<Person>();
// Any class that extends person can be added
people.add(new Customer());
people.add(new FieldEngineer());
for (Person person : people) {
    System.out.println(person);
}

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

Лучший дизайн, если вам нужна гибкость, может заключаться в сохраненииКласс Person и назначение Person роли в стиле декоратора.

Декоратор добавил бы поведение, используя композицию, а не наследование, например:

public class Customer {

    private Person person;

    public Customer(Person p) { this.person = p; }

    public void buyIt() { // do something customer like here }
}

public class FieldEngineer {

    private Person person;

    public FieldEngineer(Person p) { this.person = p; }

    public void fixIt() { // do something field engineer like here }
}
4 голосов
/ 01 июля 2011

Используйте гетерогенный список - в Java вы можете использовать такие дженерики, как этот List <Person>

2 голосов
/ 01 июля 2011

Если вы не уверены, как вам понадобится доступ к объектам в будущем, вы можете обнаружить, что HashTable <<em> Person > обеспечивает большую степень гибкости.

Поскольку он использует пары ключ-значение, вы можете быстро получить конкретный объект, а метод .keys () предлагает способ итеративного обхода всего набора, если вы сочтете это необходимым.

0 голосов
/ 01 июля 2011

Я предполагаю, что все объекты являются частью набора?

В идеале у Person должен быть get / setCustomer, а у Employee должен быть get / setFieldEngineer, и тогда структура должна выглядеть примерно так:

class CustomerRelationship{
    public Employee employee;
    public SalesEngineer salesEngineer;
    public Person customer;
}

Если объекты не являются частями набора, а представляют собой список объектов, вы можете пересмотреть свой дизайн. Или вы можете использовать instanceof везде (плохо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...