Набор данных для хранения объектов в java

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

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

Итак: Person, Customer, Employee, Sales Engineer, Инженер-программист.

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

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

Вам понадобится 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 } } 

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

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

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

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

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

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

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