4

最近我遇到了这段代码。

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

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

4

2 回答 2

8

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

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

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

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

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

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

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

于 2017-02-21T13:18:36.830 回答
5

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

未实现异常

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

因此,这是一种为所有方法提供实现的懒惰方式,CustomerQueryService只是为了在运行时找出您尚未编写它。

Note在某些UnsupportedOperationException情况下可能是可以接受的,但对于项目来说,这两者都不是一个好的“约定”。

于 2017-02-21T13:34:40.303 回答