Как из метода вызвать другой метод?

481
18 марта 2019, 09:20

При работе с API я замечаю как интересно можно "вытащить" данные из объекта.

Допустим, я хочу узнать имя друга у человека с именем Alex.

Чтобы это сделать, я пишу:
String NameOfThumb = person.getPerson("Alex").getFriends.get(0).getName();

Как сделать так, чтобы вызывая один метод, я мог сразу вызвать внутри другой, а внутри другого следующий? Как называется такое действие?

В интернете я в основном натыкаюсь на extends, implements, но примеры, которые приводят, слишком простые и обощенные. Как я понимаю, что мне стоит использовать это, только я не знаю как именно, чтобы добиться того же результата, что я привел сверху.

Прошу меня поправить, если я некорректно выразился и неправильно использовал терминологию.

Answer 1

Очевидно, у вас 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, если не найдена особа или листы не инициализированы...

В итоге получите набор методов, отвечающий за друзей конкретного человека. Типа фабрика получается.

Answer 2

Это называется 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();
    }
}
Answer 3

Каждый метод возвращает объект, метод которого вы и вызываете в следующем звене.

Код

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();
READ ALSO
Помогите разобраться с анимацией

Помогите разобраться с анимацией

Подскажите пожалуйста что поправитьДелаю анимацию на CSS

154
float right не работает

float right не работает

Всем привет, простейший код - а уже не работает float right элемента toplineю Работаю с Mozilla firefox HTML:

143
Управление обрезкой текста CSS

Управление обрезкой текста CSS

Есть некая строка "шапка" с набором разных элементовПри уменьшении ширины родителя, эта шапка будет сжиматься

143