与内部实现的接口 - 好的或坏的

der*_*itz 3 java coding-style interface

我正在开发一个带有许多someInterface的项目 - someInterfaceImpl-pairs.前几天我得到了这个想法(可能是通过阅读一些客观的c代码来启发),将默认实现包含在内部类中.现在一些同事(都有比我更多的java经验)看到了这个想法 - 反馈是震惊和惊讶之间("这有用吗?").

我google了一下,但没有发现这个"模式"(个人我喜欢它)有用的证据: pdf-paper关于代码风格的常见问题

您如何看待 - 特别是在"默认"实现紧密耦合到接口的情况下.

更新 我发现这个:Java接口 - 实现对

(见接受的答案)

Joh*_*n B 8

接口的重点是将用户与实现分开(默认与否).你通过将实现包含在内部类中来打败它.您并没有真正保存任何代码行,而且会使API混乱.您最终必须做一些事情来隐藏接口用户的内部类,比如将其设置为私有或默认范围,最好避免使用它.此外,如果您的默认实现需要更改但您已将该接口作为API的一部分发布,该怎么办?这是一个坏主意,因为它没有很多好处,而且是一种反模式.

最后,如果你真的有一个默认实现,那么也许它应该是一个基类(而不是一个接口),其他实现扩展了类和覆盖行为.

我认为这篇文章对类似问题进行了有趣的讨论: 问题

  • 如果默认实现需要更改,那么您将删除具有新实现的版本 - 这不需要更改接口定义本身.如果**用作默认实现,您也不需要隐藏实现.我没有看到任何*优点*按照OP描述的方式做到这一点,但我也没有看到你带来的负面影响也是非常可怕的 - 我只是觉得将它们混为一谈并没有意义*强制*实现更改的新界面发行版. (3认同)