При работе с API я замечаю как интересно можно "вытащить" данные из объекта.
Допустим, я хочу узнать имя друга у человека с именем Alex.
Чтобы это сделать, я пишу:
String NameOfThumb = person.getPerson("Alex").getFriends.get(0).getName();
Как сделать так, чтобы вызывая один метод, я мог сразу вызвать внутри другой, а внутри другого следующий? Как называется такое действие?
В интернете я в основном натыкаюсь на extends, implements, но примеры, которые приводят, слишком простые и обощенные. Как я понимаю, что мне стоит использовать это, только я не знаю как именно, чтобы добиться того же результата, что я привел сверху.
Прошу меня поправить, если я некорректно выразился и неправильно использовал терминологию.
Очевидно, у вас person - это какой-то класс-держатель людей (я обозвал его PersonsHandler), а getFriends - не поле, а метод. Учитывая это, а также если предположить, что нулевой друг это "лучший друг", то можно так:
public static void main(String[] args) {
PersonHandler personsHandler = new PersonHandler(personsHandler);
String nameOfThumb = getBestFriendOfAlex(personsHandler);
}
private static List<Person> getPersonsFriends(PersonHandler personsHandler, String personName) {
return personsHandler.getPerson(personName).getFriends();
}
private static Person getPersonBestFriend(PersonHandler personHandler, String personName) {
return getPersonsFriends(personHandler, personName).get(0);
}
private static String getBestFriendOfAlex(PersonHandler personsHandler) {
return getPersonBestFriend(personsHandler, "Alex").getName();
}
private static String getBestFriendOfJohn(PersonHandler personsHandler) {
return getPersonBestFriend(personsHandler, "John").getName();
}
Класс PersonHandler
public class PersonHandler {
private List<Person> persons = new ArrayList<>();
public Person getPerson(String name) {
return new Person(); // ищете в коллекции по имени
}
}
Класс Person
public class Person {
private List<Person> friends;
private String name;
public String getName() {
return name;
}
public List<Person> getFriends() {
return friends;
}
}
ну и плодить необходимые вам методы getBestFriendOfXXX. Можно также дальше убирать параметры из методов, создавая например getBestFriendOfXXXFromConcretePersonHandler() итд...
Ну и не забывать, что можем получить NPE, если не найдена особа или листы не инициализированы...
В итоге получите набор методов, отвечающий за друзей конкретного человека. Типа фабрика получается.
Это называется fluent interface и достигается возвращением из метода того объекта, методы которого могут вызываться дальше в цепочке. Часто из методов возвращается ссылка на самого себя.
public class Example {
public Example someMethod() {
System.out.println("Hello");
return this;
}
public Example anotherMethod() {
System.out.println("World");
return this;
}
public static void main(String[] args) {
Example obj = new Example();
obj.someMethod().anotherMethod();
}
}
Каждый метод возвращает объект, метод которого вы и вызываете в следующем звене.
Код
String NameOfThumb = person.getPerson("Alex").getFriends.get(0).getName();
аналогичен
Person alex = person.getPerson("Alex").
List<Person> friends = alex.getFriends();
Person alexesFriend = friends.get(0);
String name = alexesFriend.getName();
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости