当前位置: 首页 > 知识库问答 >
问题:

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

侯善
2023-03-14

最近我遇到了这段代码。

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

后来,它变成了这个项目的一般惯例。这是否被认为是一种良好的做法?

共有1个答案

梁渊
2023-03-14

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

于是,依“据书”;可以像您的示例中那样使用它们:为一个被视为“可选”的方法抛出异常。但这意味着:你已经有了一些方法;而且你正在添加新的。

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

但除此之外:在您的示例中,您有一个新的接口...它只有一个方法。我认为这并不属于那些“预期用途”的范畴。

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

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

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

 类似资料:
  • 我试图使用以下代码理解Java接口中的默认方法,但我无法编译它: 编译器生成了以下输出: 我无法理解这些错误。我如何更正代码中的问题?

  • 我想通过创建一个具体实现类的对象来执行接口中默认方法的定义体,该对象也覆盖了该方法。无论我是直接创建具体实现类的对象,还是通过动态绑定/多态,实现类中定义/重写的主体都只是得到执行。请看下面的代码 我想知道如何在控制台内部界面银行打印以下内容--loan()

  • 我读过这段代码,其中接口抛出异常,但实现它的类没有抛出异常或捕获异常,这是为什么?它在java中是合法的还是安全的?

  • 问题内容: 向所有Java专家致敬! 从Java8开始,我们可以在接口中使用默认实现(是的!)。但是,当您想从默认方法登录时会出现问题。 我有种感觉,每次我想在默认方法中记录某些内容时都调用.getLogger()是不明智的。 是的,可以在接口中定义静态变量-但这对于接口而言不是一个好习惯,而且+暴露了记录器(必须是公开的)。 我目前的解决方案: LogHolder仍然对所有人可见,这实际上没有任

  • 问题内容: 考虑以下情况, 在上面的例子中我得到以下输出这是 相当 期待。 我一直在阅读有关默认方法的信息, 尤其是 关于扩展包含默认方法的接口的信息 2 第二子弹:重新声明的默认方法,这使得它的抽象。 在上面的示例中,我有两个接口的默认方法具有相同的名称,并且当我实现这两个接口时,我只能实现对的引用。 我对此几乎没有疑问, 我怎样才能 到达 的方法 和 如果我不能比,为什么? 没有这种行为从本质

  • 根据我读到的其他问题(为什么重写方法不能抛出比重写方法更广的异常?以及Java方法抛出异常) 我知道子类中的重写方法必须抛出在重写方法中抛出的异常的相同或一个子类。 Java方法总是至少抛出一个类型为exception的异常吗? ...换句话说,编译器添加抛出异常 因此类X将如下所示 我想澄清的是,对于始终添加默认异常处理程序异常这一事实,我没有搞错。 相关问题: IOException与Runt