在接口默认方法中抛出异常

时间:2017-02-21 13:15:36

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

最近我遇到了这段代码。

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

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

2 个答案:

答案 0 :(得分:8)

人们可以开始here看看Java的“代理之父”之一Brian Goetz所说的“如何使用默认方法”。

所以,根据“书籍”;一个人可以像你的例子一样使用它们:为一个被视为“可选”的方法抛出异常。但这意味着:你已经有了一些方法;你正在添加新的。

将默认方法添加到Java语言的主要目的是允许对现有接口进行不间断的增强。它们意味着被用作某种“mixin”/多继承/特征 - 就像提供构造一样。

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

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

但有一点需要注意......我的C ++同事有一个严格的策略:它们允许在继承树中完全一个实现任何抽象方法;因为当您查看某些方法的错误实现时调试问题是非常困难。现在我们也可以继承Java中的默认方法了......调试问题可能以同样的方式在Java中变得更难。所以要小心如何使用这些东西!

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

答案 1 :(得分:5)

我会说它很糟糕,因为异常类型和报告它是项目中的惯例。

NotImplementedException

  

NotImplementedException表示作者此时尚未在程序中实现逻辑的情况。这可以作为基于例外的TODO标记。

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

注意UnsupportedOperationException某些案例中可能是可接受的,但对于项目而言,这两者都不是一个好的“惯例”。