【问题标题】:Throw exception in interface default method在接口默认方法中抛出异常
【发布时间】:2017-07-11 03:18:05
【问题描述】:

最近我遇到了这段代码。

public interface CustomerQueryService {    
    default Customer getCustomerById(long id) {
        throw new NotImplementedException();
    }
}

后来,事实证明这是这个项目的一般惯例。 它被认为是一种好的做法吗?

【问题讨论】:

  • 因此,虽然您概述的用法通常是可以接受的(这是“可选方法”的习惯用法),但这是您项目中的“一般约定”这一事实是一个巨大的尖叫危险信号。为了正确看待这一点,我只使用过几次这种模式(例如,Iterator.remove())。将其经常用作“一般约定”几乎可以肯定是过度使用。
  • 更一般地说,经常使用这种约定实际上是将“实现接口”从静态类型属性降级为动态类型属性。这总是会在毫无戒心和不值得的用户手中爆炸,因为他们有理由相信“implements Foo”真的意味着“implements Foo”。真正的选择性是罕见的;像这样对待它。
  • @BrianGoetz 并记录在案;有你在场,我感到非常荣幸;-)

标签: java exception interface java-8 default-method


【解决方案1】:

您可以开始here 了解 Java 的“代理之父”之一 Brian Goetz 对“如何使用默认方法”的看法。

所以,根据“书本”;可以像在您的示例中一样使用它们:为被视为“可选”的方法引发异常。但这意味着:您已经有了一些方法;你正在添加新的。

向 Java 语言添加默认方法的主要目的是允许对现有接口进行不间断的增强。它们打算用作某种“混合”/多继承/类似特征的提供构造。

但除此之外:在您的示例中,您有一个 new 界面......只有那个 one 方法。我认为这不属于那些“预期用途”。

另一方面;不要太多“关于书”。当整个团队都同意“这就是我们所做的”,并且每个人都理解并接受它时;为什么不?!

但有一个警告......我的 C++ 同事有一个 strict 策略:他们允许在继承树中精确地 一个 实现任何抽象方法;因为当您查看某个方法的错误实现时,调试问题非常困难。现在我们也可以继承 Java 中的默认方法了……在 Java 中调试问题可能会以同样的方式对我们来说变得更加困难。所以要小心如何使用这些东西!

长话短说:如果您的开发团队中的大多数人都认为这是一种有用的做法,那么这是一种很好的做法。如果不是,那就不是。

【讨论】:

  • 我同意,但我建议在适用的情况下通过引用来源来改进。
【解决方案2】:

我会说这很糟糕,因为异常类型和报告说这是项目中的约定。

NotImplementedException:

NotImplementedException 表示作者尚未在程序中实现该点的逻辑的情况。这可以作为基于异常的 TODO 标记。

所以这是一种懒惰的方式来为所有CustomerQueryService 中的方法提供一个实现,只是为了在运行时发现你还没有编写它。

注意UnsupportedOperationException某些 情况下可能是可接受的,但对于项目而言,这两者都不是一个好的“约定”。

【讨论】:

  • @Loc 好的,这只是巧合,因为您对答案的回复与否决票的时间完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多