Допустим, у вас есть этот интерфейс:
public interface OnItemTouchListener {
boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
}
И вы решаете реализовать это самостоятельно:
public class MyOwnOnItemTouchListener implements OnItemTouchListener {
@Override
boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
boolean result = doSomething(e);
return result;
}
@Override
void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
doSomethingElse(rv, e);
doSomethingMore(rv);
}
@Override
void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
if (disallowIntercept) {
doADifferentThing();
}
}
}
Все хорошо ...
... пока, через шесть месяцев, OnItemTouchListener
не будет изменен, чтобы ввести новый метод:
public interface OnItemTouchListener {
boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
// New method
void onMultiTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
}
И вдруг ваше приложение больше не будет компилироваться ?
Error: MyOwnOnItemTouchListener is not abstract and does not override abstract method onMultiTouchEvent() in OnItemTouchListener
И это даже не ваша ошибка, вы ничего не изменили! Просто изменился интерфейс и ваш код не обновился с этим изменением.
Чтобы избежать этого , разработчики API предлагают вам класс реализации "по умолчанию" , SimpleOnItemTouchListener
, то есть , гарантированно всегда обновленный с интерфейсом , и что вы можете расширить вместо:
public class SimpleOnItemTouchListener implements OnItemTouchListener {
// empty, override in your class
boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { return false; }
// empty, override in your class
void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {}
// empty, override in your class
void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}
}
Таким образом, вместо непосредственной реализации интерфейса, вы можете сделать это:
public class MyOwnOnItemTouchListener extends SimpleOnItemTouchListener { //extend Simple instead of implementing interface
@Override
boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
boolean result = doSomething(e);
return result;
}
@Override
void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
doSomethingElse(rv, e);
doSomethingMore(rv);
}
@Override
void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
if (disallowIntercept) {
doADifferentThing();
}
}
}
Теперь, если через шесть месяцев разработчикам API потребуется ввести новый метод, они изменят оба класса, как гарантировано :
public interface OnItemTouchListener {
boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
// New method
void onMultiTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
}
public class SimpleOnItemTouchListener implements OnItemTouchListener {
// empty, override in your class
boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { return false; }
// empty, override in your class
void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {}
// empty, override in your class
void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}
// New method
// empty, override in your class
void onMultiTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {}
}
И теперь, несмотря на эти изменения, MyOwnOnItemTouchListener
все равно скомпилирует , даже если он не реализует onMultiTouchEvent
, потому что если в любой момент вызывается MyOwnOnItemTouchListener.onMultiTouchEvent()
, он просто использует ( пустой) реализация от своего родителя, SimpleOnItemTouchListener
.
И Ваше приложение будет продолжать работать ?
Теперь, отвечая на ваши точные вопросы:
Это потому, что SimpleOnItemTouchListener
реализует OnItemTouchListener
и обеспечивает некоторое поведение по умолчанию?
Да. Хотя здесь «поведением по умолчанию» является «вообще ничего не делать», поэтому вам все равно нужно реализовать методы в своем собственном слушателе, если вы действительно хотите что-то сделать.
Так что, если OnItemTouchListener
будет обновлено, SimpleOnItemTouchListener
все равно вернет поведение по умолчанию.
Да, именно так.
Часть о "если интерфейс может измениться". Они говорят о OnItemTouchListener
?
Да.
Однако, SimpleOnItemTouchListener
, похоже, имеет пустые методы и ничего больше.
Да. «Поведение по умолчанию», которое они предоставляют, просто «ничего не делать» Это просто способ избежать сбоев компиляции.
Вы все еще должны реализовать методы осмысленно. Но теперь у вас есть сеть безопасности, если когда-нибудь будут внедрены новые методы.
Я бы сказал, что вы действительно поняли суть, просто пустая реализация по умолчанию сбивала с толку.