Всем привет! Возникли сложности с пониманием программы, сориентируйте, пожалуйста, по происходящему.
Я понимаю, что программа работает так:
1) Мы наследуем наши новые классы от NamedItem, чтобы унаследовать приватные поля и неприватные методы для доступа к полям
2) Мы создаем методы, которые возвращают списки с типом каждого класса, чтобы их напечатать
3) Список каждого класса формируется во вспомогательном классе AbstractDbSelectExecutor<T extends NamedItem> таким образом:
- в новосозданном объекте анонимного класса, наследующегося от абстрактного мы вызываем метод getQuery() и передаем туда недостающую строку запроса
- после чего у этого же объекта мы вызываем метод execute(), чтобы заполнить поля объекта и вернуть их с помощью списка
4) В методе print() мы проходимся по списку и смотрим значение полей его объектов, чтобы вывести на экран
Какие есть вопросы:
1) 1Верно ли, что классы-наследники действительно наследуют приватные поля класса NamedItem? Или они просто через методы получают доступ к полям класса-родителя?
2) У нас получается логика распределена по нескольким классам (в NamedItem шаблон будущих классов, в AbstractDbSelectExecutor шаблон получения списка, в анонимных классах передача одного из аргументов для создания списка, в Solution логика по выводу списка на экран). Если это так, то насколько это корректно? Мне кажется более логичным переопределить метод toString в классе-родителе, или хотя бы создать в нем поле под запрос и определить его значение в классах-наследниках
Почему спрашиваю — долго провозилась с задачей, чтобы понять, что написано, хочу устранить пробелы, которые помешали быстро разобраться
package com.javarush.task.task23.task2309;
import com.javarush.task.task23.task2309.vo.*;
import java.util.List;
/*
Анонимность иногда так приятна!
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
print(solution.getUsers());
print(solution.getLocations());
}
public static void print(List list) {
String format = "Id=%d, name='%s', description=%s";
for (Object obj : list) {
NamedItem item = (NamedItem) obj;
System.out.println(String.format(format, item.getId(), item.getName(), item.getDescription()));
}
}
public List<User> getUsers() {
return new AbstractDbSelectExecutor<User>() {
@Override
public String getQuery() {
return "SELECT * FROM USER";
}
}.execute();
}
public List<Location> getLocations() {
}
public List<Server> getServers() {
}
public List<Subject> getSubjects() {
}
public List<Subscription> getSubscriptions() {
}
}