Что будет со ссылкой на метод, если заменить объект-владельца?
Чтобы ответить на данный вопрос требуется знать, что такое ссылки и что такое ссылки на метод.
Если метод обычный, не статический, то для него применяется позднее связывание. При обращении к данному методу по указанной ссылке мы получаем нужный метод. В примере, приведённом ниже, метод, определённый в классе А не используется.
Чтобы не запутаться в связывании, следует помнить, что позднее связывание происходит в момент обращения к требуемому методу, а не вызова. Поэтому, в переменной находится постоянная копия ссылки на функцию. Она указывает на функцию. А значит переписывание переменной не повлияет на ссылку.
Чтобы добиться реального связывания можно воспользоваться инструкцией invokedynamc, но проще применить поведенческий паттерн объектно-ориентированного программирования, такой как «Посетитель».
class A {
void printMe() { System.out.println("A"); }
}
class В extends A {
@Override void printMe() { System.out.println("B"); }
}
class C extends В {
@Override void printMe() { System.out.println("C"); }
}
A target = new B();
Runnable methodReference = target::printMe;
target = new C();
// methodReference не сохраняет связь с обновлённый target
methodReference.run (); // напечатает "В"
Как в продуктовой команде
Обучающая платформа AndroidSprint
Kanban-доска, код-ревью и Git Flow. Учитесь работать в процессах, которые используют в продакшене — задачи, как в Jira
- Kanban: доска задач как в Jira — привыкаете к инструментам с первого дня
- Процессы: код-ревью, Git workflow, спринты — как на реальной работе
- Треки: Android, Backend, QA — полный цикл разработки