У меня есть курсовой проект, и я не могу решить следующую проблему:
Мне нужно создать связанный список, в который я могу добавить список элементов из класса с именем Person и список элементов из класса с именем Accounts, используя addAll()
List<Person> persons= new LinkedList<Person>();
List<Accounts> accounts= new LinkedList<Accounts>();
List<???> elements = new LinkedList<>();
elements.addAll(persons);
elements.addAll(accounts);
Мой учитель приказал сделать класс ElementsOfTheBank, чтобы заполнить место ???, но я не мог понять, как заставить его работать :(
Вам нужен общий тип, который используется всеми элементами банка. Тривиально, java.lang.Object
является общим для них всех, но, возможно, вас просят сделать, например. public interface ElementOfBank
, чтобы затем вы могли объявить свой класс Person как class Person implements ElementOfBank {}
.
Как только вы это сделаете, вы можете объявить, что ваш список состоит из этого элемента: List<ElementOfBank> elements = ...;
, и вы можете вызвать .addAll(persons)
в таком списке. В конце концов, каждый экземпляр человека также является ElementOfBank, вот что означает class Person implements ElementOfBank
.
Это своего рода плохой пример, но ваш учитель, вероятно, хочет, чтобы вы использовали наследование.
Поскольку человек и счет являются «элементами банка», ваши классы могут выглядеть так:
class ElementsOfTheBank {
// common variables between Person and Account
}
class Person extends ElementsOfTheBank {
// ...
}
class Account extends ElementsOfTheBank {
// ...
}
Затем вы можете добавить оба типа в свой список:
List<ElementsOfTheBank> elements = new LinkedList<>();
elements.addAll(persons);
elements.addAll(accounts);
Да. ElementsOfTheBank также может быть интерфейсом
Не используйте Коллекции только для объединения связанных объектов.
Нет особого смысла создавать List<Object>
, чтобы Person
и Account
списки вместе. Введение общего супера из Person
и Account
тоже не кажется хорошей идеей. В чем преимущество привязки через Наследование физического лица и счета в банке? Я бы предпочел установить связь между человеком и его аккаунтами через Состав (а не Наследование).
Лучшим вариантом было бы создать class
, скажем, Bank
. Это инкапсулирует два списка. т.е. вы можете ввести поведение для управления банками-клиентами и их счетами, и экземпляр банка станет единой точкой входа для всех операций, которые вам нужно выполнить с ними.
public class Bank {
private List<Person> persons= new LinkedList<>();
private List<Accounts> accounts= new LinkedList<>();
// constructors, getters
public boolean createAccount() {
// TO DO ...
return ...;
}
public Person findPerson(SomeProperty id) {
// TO DO ...
return ...;
}
}
Для реального проекта вы правы. Но это искусственное упражнение для новичков, которым, скорее всего, следует изучать через него наследование и полиморфизм. В этом отношении ваш ответ неверен или, по крайней мере, бесполезен.
@tquadrat Ответы на SO предназначены для того, чтобы принести пользу читателям (не только OP). Вы признали, что логика верна, как ответ бесполезен. Во-вторых, злоупотребление коллекцией — это очень распространенный антипаттерн среди новичков, никто не может по-настоящему понять ОО, если они не в состоянии распознать, что набор свойств должен составлять объект. Это важный дизайн класса, а не корпоративная разработка. Похоже, вы упустили суть того, о чем я говорил. Если можно, я бы посоветовал избегать самоуверенных комментариев (вы выполнили требования к заданию OP?).
Приятно читать об самоуверенных комментариях под ответом, основанным на мнении. Никто бы не жаловался на ваш "ответ", если бы вы действительно дали ответ на вопрос, а потом придумали проповедь о правильном дизайне и злоупотреблении коллекцией (см. ответ от 7evy о том, как это могло бы выглядеть). И, кстати, эта проповедь потрачена впустую для вопрошающего, потому что он только что переслал нам плохо сформулированный вопрос от своего учителя/инструктора/профессора.
Значит, ваш голос должен означать, что этот ответ не имеет ценности? Я был бы признателен, если бы вы предоставили конструктивную критику вместо того, чтобы говорить от имени ОП.
Есть ли особая причина, почему это
Accounts
, а неAccount
?