При работе с 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();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Всем привет, простейший код - а уже не работает float right элемента toplineю Работаю с Mozilla firefox HTML:
Есть некая строка "шапка" с набором разных элементовПри уменьшении ширины родителя, эта шапка будет сжиматься