Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在接口默认方法中引发异常_Java_Exception_Interface_Java 8_Default Method - Fatal编程技术网

Java 在接口默认方法中引发异常

Java 在接口默认方法中引发异常,java,exception,interface,java-8,default-method,Java,Exception,Interface,Java 8,Default Method,最近我遇到了这个代码 public interface CustomerQueryService { default Customer getCustomerById(long id) { throw new NotImplementedException(); } } 后来,事实证明这是这个项目的一般惯例。 这被认为是一种好的做法吗 我们可以开始看看Java的“代理父亲”之一Brian Goetz对“如何使用默认方法”的看法 所以,根据"书",;可以像

最近我遇到了这个代码

public interface CustomerQueryService {    
    default Customer getCustomerById(long id) {
        throw new NotImplementedException();
    }
}
后来,事实证明这是这个项目的一般惯例。 这被认为是一种好的做法吗

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

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

main向Java语言添加默认方法的目的是允许对现有接口进行不间断的增强。它们是而不是意味着用作某种“混合基因”/多重遗传/特征,如提供结构

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

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

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


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

我认为这是不好的,因为异常类型和报告称这是项目中的惯例

:

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

因此,这是一种懒散的方式,可以跨所有
CustomerQueryService
为方法提供实现,只是为了在运行时发现您还没有编写它


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

我同意,但我建议在适用的情况下引用源代码进行改进。因此,虽然您概述的用法通常是可以接受的(这是“可选方法”习惯用法),但事实上这是在您的项目中,“常规”是一个巨大的危险信号。为了正确看待这一点,我只使用过几次这种模式(例如,
Iterator.remove()
),将其作为“常规”定期使用几乎可以肯定是过度使用。更一般地说,定期使用这种惯例实际上是降级从静态类型属性到动态类型属性的“实现接口”。这将不可避免地发生在毫无戒心和不值得信任的用户手中,因为他们有理由相信“implements Foo”实际上意味着“implements Foo”。“真正的选择权是罕见的;这样对待它。@BrianGoetz,并记录在案;在你面前我感到非常荣幸;-)@好吧,只是巧合,否决票和你回答问题的时间正好是同一时间。