Java 具有赢得';不要破坏未来的修改
我正在阅读Android的Java 具有赢得';不要破坏未来的修改,java,oop,inheritance,interface,Java,Oop,Inheritance,Interface,我正在阅读Android的RecyclerView的源代码,我正在使用SimpleOnItemTouchListener并阅读关于这个类的文档。但我不确定我是否理解这句话的含义: 使用此类的另一个好处是将来的兼容性。由于接口可能会更改,我们将始终在此类上提供默认实现,以便在更新到新版本的支持库时代码不会中断 这是因为SimpleOnItemTouchListener实现了OnItemTouchListener并提供了一些默认行为吗?因此,如果更新了OnItemTouchListener,则Sim
RecyclerView
的源代码,我正在使用SimpleOnItemTouchListener
并阅读关于这个类的文档。但我不确定我是否理解这句话的含义:
使用此类的另一个好处是将来的兼容性。由于接口可能会更改,我们将始终在此类上提供默认实现,以便在更新到新版本的支持库时代码不会中断
这是因为SimpleOnItemTouchListener
实现了OnItemTouchListener
并提供了一些默认行为吗?因此,如果更新了OnItemTouchListener
,则SimpleOnItemTouchListener
仍将返回默认行为
关于“接口是否可能更改”的部分。他们是在谈论OnItemTouchListener吗
但是,SimpleOnItemTouchListener
似乎只有空方法,没有其他方法
这是因为SimpleOnItemTouchListener实现了OnItemTouchListener并提供了一些默认行为吗
不,它只是用空方法实现接口。正如您所知,当您实现接口时,您需要为所有接口方法添加定义,否则您将得到编译错误。但是如果你扩展了一个类,你就不需要覆盖所有的基方法(除非它们不是抽象的,但这里不是这样)
关于接口是否可能更改的部分。他们是在谈论蒙图希利斯特吗
是的,他们谈到正在更改接口RecyclerView.OnItemTouchListener:
假设他们向RecyclerView.OnItemTouchListener添加了一个新方法:
void foo()
,那么如果您升级了支持库,并且直接在类中实现了RecyclerView.OnItemTouchListener
,那么您将得到编译器错误(您需要在类中实现foo()
)。在android团队中,他们承诺将在中实现foo(),因此如果您在MyOnItemTouchListener
中扩展它,他们将已经有空的实现-因此没有编译错误。假设您有以下接口:
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();
}
}
}
一切都很好…... 直到六个月后,
onimtouchlistener
被修改以引入一种新方法:
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);
}
突然,你的应用程序不再编译了,我发现它或多或少是一个实现。随着android的不断发展,交互将永远不会相同,并将随着操作系统的发展而不断发展
在这里,可以实现根接口OnItemTouchListener,以便应用程序控制已使用或正在使用的触摸事件。简单地说,onimtouchlistener
说“你想处理触摸事件吗?实现我!但要准备好处理我为你捕捉到的各种新手势。我是动态的”
现在,另一个人SimpleOnItemTouchListener
站在中间说,“嘿,我可以
您的顾问与OnItemTouchListener
。我们可以就处理事宜达成协议。即使OnItemTouchListener
对新事物感到愤怒,我也会帮助您保持冷静,不要改变。我会承受痛苦,确保您不受打扰”
因此,它的简单性,OniTouchListener
可能会随着Android的发展而发展SimpleOnItemTouchListener
可能会随着OnItemTouchListener
的发展而演变,但不会在当前的任何行为中弃用或退化
添加更多内容,因为
SimpleOnItemTouchListener
为您提供了一个默认实现,所以您的代码看起来很整洁,因为您只需要覆盖所需的内容 我目前正在为我正在进行的项目开发一个插件框架。我试图通过对接口进行版本控制来解决这个问题。我有一个基本的实现,就像瓦伦所说的。然而,我担心的是那些实现接口而不是基本实现的人。当然,如果我更改了接口并发布了新版本,我就破坏了那些决定不扩展基类的插件
核心应用程序使用该部分代码所需的接口的任何版本。V2版本的接口将扩展V1,V3版本将扩展V2,等等。我没有直接调用所有插件,而是使用一个管理器类来完成这项工作。这使我能够确保,如果一个V3特性试图执行,我只在实现了V3版本插件接口的插件上执行
如果我只是公开基类并对公共API隐藏接口,我可能只需要一个其他人扩展的基类实现就可以了。不幸的是,由于接口也是公共的,我必须确保我不会破坏没有扩展基类的开发人员