Актуальная версия статьи доступна на моём новом сайте devmark.ru.
Такой вопрос на знание Java часто любят задавать на собеседованиях. Предположим, у вас имеется интерфейс, его реализация и наследник этой реализации.
Такой вопрос на знание Java часто любят задавать на собеседованиях. Предположим, у вас имеется интерфейс, его реализация и наследник этой реализации.
interface MyInterface { void doWork(); } class MyBaseObject implements MyInterface { @Override public void doWork() { System.out.println("Base"); } } class MyChildObject extends MyBaseObject { @Override public void doWork() { System.out.println("Child"); } }
А также имеется набор из трёх перегруженных методов. Один принимает этот интерфейс, другой - реализацию, а третий - наследника.
Вопрос: какой из этих методов будет использован, если мы захотим вызвать метод over() и передадим в него null?
Ответ: в таком случае на экране мы увидим слово "Child".
Поэтому можно выделить для себя такое мнемоническое правило, что при передаче null в перегруженный метод всегда будет использоваться наиболее частная реализация (наследник).
P.S. Пример несколько синтетический. На практике я бы избегал ситуации, когда в метод нужно передавать null. Вполне вероятно, что если внутри него нет специальной проверки, то будет NullPointerException.
Также я бы избегал перегрузки методов. Это может и выглядит красиво, но в Enterprise-приложениях, когда у вас over 9000 классов, это вносит дополнительную сложность в понимании.
Отсюда мораль для работодателей: не задавайте на собеседованиях глупых вопросов! А если кто-то любит писать такой код, то лучше его сразу уволить)
void over(MyInterface face) { System.out.println("Interface"); } void over(MyBaseObject base) { System.out.println("Base"); } void over(MyChildObject child) { System.out.println("Child"); }
Вопрос: какой из этих методов будет использован, если мы захотим вызвать метод over() и передадим в него null?
Ответ: в таком случае на экране мы увидим слово "Child".
Поэтому можно выделить для себя такое мнемоническое правило, что при передаче null в перегруженный метод всегда будет использоваться наиболее частная реализация (наследник).
P.S. Пример несколько синтетический. На практике я бы избегал ситуации, когда в метод нужно передавать null. Вполне вероятно, что если внутри него нет специальной проверки, то будет NullPointerException.
Также я бы избегал перегрузки методов. Это может и выглядит красиво, но в Enterprise-приложениях, когда у вас over 9000 классов, это вносит дополнительную сложность в понимании.
Отсюда мораль для работодателей: не задавайте на собеседованиях глупых вопросов! А если кто-то любит писать такой код, то лучше его сразу уволить)
Комментариев нет:
Отправить комментарий