如果我生成一个包含 3 个方法的接口,
a
、b
、c
,那么所有实现该接口的类都需要为其添加方法体。只要我在一个项目中工作就可以了。不过,当我发布我的库时,我失去了对人们如何使用接口的控制 - 如果将来我要向接口添加一个方法d
,那么之前编写的所有代码都将失败,因为现有的类没有实现它。这可以通过升级这些库来克服,但如果它们是由第三方人员发布的,这是不可能的(除非开源),这会使整个过程失败。
解决方案可能是
新接口很好,但这意味着没有新功能实际上可以在接口中包含新方法,这是不理想的。
您之前是否遇到过这个问题并决定使用默认的空白实现方法?
default
接口实现你说:
如果将来我要向接口添加方法 d,那么之前编写的所有代码都将失败,因为现有类没有实现它。
解决方案可能是……添加……实施
允许在 Java 中的
default
上实现 interface
的发明就是为了精确解决您的问题。
添加 lambda 时,Java 团队需要向 Java Collections Framework 中的接口添加新的方法签名。可以通过在捆绑类上实现新方法来支持向接口添加新方法签名,但他们面临着在 JDK/JRE 之外,其他方已经编写了实现这些接口的类的问题。正如您所指出的,突然出现的新添加的未实现的方法会破坏兼容性。通过发明要放置在界面中的
default
实现,问题就解决了。旧类会在需要时自动回退到 default
方法实现。
通常,不鼓励在 Java 中实现接口。但你的情况正是它们打算使用的情况。
有关更多信息,请参阅JEP 126:Lambda 表达式和虚拟扩展方法。 “虚拟扩展方法”是 default
上的
default
实现。从技术上讲,Java 中 interface
上的
default
实现是更广为人知的 Mixin的形式。 多种接口
解决方案可能是......创建一个额外的界面
是的,这可能是一个聪明的方法。当您的情况可以清晰地分为相关行为组时,执行此操作,实现类可能在逻辑上参与一组行为,同时拒绝另一组行为,这是有道理的。
请记住,一个接口可以有子接口。您可以添加从现有接口(超级接口)扩展而来的新接口。实现超接口的类没有义务实现子接口。并且,实现子接口的类也将实现超级接口。