跳到主要内容

Java 接口和抽象类,我更习惯先看变化方向

· 阅读需 2 分钟
一介布衣
全栈开发者

“接口和抽象类怎么选”几乎是每个 Java 学习阶段都会碰到的问题。
很多回答会从语法、继承、默认实现这些点切入,这些都没错。但 2017 年我在项目里慢慢形成的判断是:真正决定选择的,常常不是当前写起来哪个方便,而是未来变化会往哪个方向长。

如果你预期的是“能力协作”,我更偏接口

当我更在意一组对象能否围绕同一份能力契约协作时,接口通常更自然。
它表达的是“你只要满足这些行为,就能接进来”,而不是“你和我在实现层已经有很多共同部分”。

这种场景下,接口会让边界更轻。

如果你预期的是“共用骨架”,我更看抽象类

有些对象之间不仅行为相似,连实现路径、共享状态、初始化流程都很接近。
这时抽象类更像一个稳定骨架,它允许你把共用部分收起来,不必每个实现都重新背一遍。

也就是说,它更适合那些“变化围绕同一套骨架展开”的场景。

我为什么说先看变化方向

因为很多设计在当前都说得通,问题只会在未来扩展时暴露。
如果一组类型未来更可能横向扩展能力,用接口会更轻;如果更可能围绕同一套实现细节迭代,抽象类往往更顺。

你越早看清变化方向,后面改造成本越低。

小结

Java 里的接口和抽象类,不一定非要争出一个绝对更高级的答案。
对我来说,最稳的判断方式是先看未来变化长什么样。语法差异只是表层,真正决定舒服不舒服的,还是它有没有顺着变化方向设计。