Реализация интерфейса Java на примере Runnable
Столкнулся с такой реализацией интерфейса:
Runnable r = new Runnable {
void run() {
// что-то делает
}
}
Я понимаю, что это многопоточность и интерфейс Runnable отвечает за многопоточность. Но вот такая реализация интерфейса - как класса мне не понятна. Я не могу сообразить, как такое загуглить. Поиск выдает стандартную реализацию через имплементс.
Такая реализация имеет свое название? Что это такое вообще?
Ответы (2 шт):
Это реализация интерфейса через анонимный класс. Современным вариантом (развитием анонимных классов) являются лямбда-выражения:
Runnable runnable = () -> {
};
Создавать анонимный класс можно не только от интерфейса, но и от абстрактного класса, а также от обычного.
Вообще, такая запись, через new, довольно забавная. Она выглядит почти как создание объекта (с той разницей, что появляются фигурные скобки), и это иногда путает новичков: кажется, будто происходит инстанцирование интерфейса / абстрактного класса, что невозможно.
Особенно когда не нужно переопределять принудительно какие-то методы, и получается что-то вроде:
AbstractClass example = new AbstractClass() {};
Где-то на ruSO даже был вопрос, как человека на собеседовании попытались этой темой сбить с толку, но не смог сейчас найти его.
Это анонимный класс. Просто одноразовая реализация интерфейса Runnable. Такой подход удобен, когда вам не нужна отдельная именованная реализация, и вы не планируете использовать её повторно.
Runnable — это функциональный интерфейс, то есть интерфейс с единственным абстрактным методом. В Java это своего рода костыль для поддержки функционального программирования, ведь в языке нет функций как самостоятельных объектов — есть только методы.
Благодаря функциональным интерфейсам можно, например, сохранять поведение (реализацию метода) в переменную, как в вашем примере, или сразу передавать его в другой метод — без создания отдельной переменной, как здесь вот например