在接口默认方法中抛出异常
Throw exception in interface default method
最近我发现了这段代码。
public interface CustomerQueryService {
default Customer getCustomerById(long id) {
throw new NotImplementedException();
}
}
后来发现这是这个项目的通用约定。
它被认为是一种好的做法吗?
可以开始 看看 Java 的 "acting fathers" 之一 Brian Goetz 对 "how to use default methods" 的看法。
所以,根据"to the books";可以像在您的示例中那样使用它们:为被视为 "optional" 的方法抛出异常。但这意味着:你已经有了一些方法;并且您正在添加新的。
向 Java 语言添加默认方法的 main 目的是允许 non-breaking 增强现有接口。它们 不是 旨在用作某种 "mixin" / multi-inheritance / traits-like 提供结构。
但除此之外:在您的示例中,您有一个 new 接口......只有 one 方法。我认为这不属于那些 "intended usages".
另一方面;不要太多"about the books"。当整个团队都同意 "this is what we do",并且每个人都理解并接受时;为什么不?!
但有一个警告......我的 C++ 同事有一个 strict 政策:他们允许 one 实现任何抽象继承树中的方法;因为当您查看某些方法的错误实现时,很难调试问题。现在我们也可以在 Java 中继承默认方法...调试问题 可能 在 Java 中以同样的方式对我们来说变得更难。所以要小心这些东西是怎么用的!
长话短说:如果您的开发团队中的大多数人认为这是一种有用的做法,那么它就是一种很好的做法。如果不是,那就不是。
我会说这很糟糕,因为异常类型和报告说这是项目中的约定。
NotImplementedException represents the case where the author has yet to implement the logic at this point in the program. This can act as an exception based TODO tag.
所以这是一种懒惰的方法,可以为所有 CustomerQueryService
的方法提供实现,只是为了在运行时发现您尚未编写它。
注意 UnsupportedOperationException
在 一些 情况下可能是可以接受的,但对于项目来说都不是一个好的 "convention"。
最近我发现了这段代码。
public interface CustomerQueryService {
default Customer getCustomerById(long id) {
throw new NotImplementedException();
}
}
后来发现这是这个项目的通用约定。 它被认为是一种好的做法吗?
可以开始
所以,根据"to the books";可以像在您的示例中那样使用它们:为被视为 "optional" 的方法抛出异常。但这意味着:你已经有了一些方法;并且您正在添加新的。
向 Java 语言添加默认方法的 main 目的是允许 non-breaking 增强现有接口。它们 不是 旨在用作某种 "mixin" / multi-inheritance / traits-like 提供结构。
但除此之外:在您的示例中,您有一个 new 接口......只有 one 方法。我认为这不属于那些 "intended usages".
另一方面;不要太多"about the books"。当整个团队都同意 "this is what we do",并且每个人都理解并接受时;为什么不?!
但有一个警告......我的 C++ 同事有一个 strict 政策:他们允许 one 实现任何抽象继承树中的方法;因为当您查看某些方法的错误实现时,很难调试问题。现在我们也可以在 Java 中继承默认方法...调试问题 可能 在 Java 中以同样的方式对我们来说变得更难。所以要小心这些东西是怎么用的!
长话短说:如果您的开发团队中的大多数人认为这是一种有用的做法,那么它就是一种很好的做法。如果不是,那就不是。
我会说这很糟糕,因为异常类型和报告说这是项目中的约定。
NotImplementedException represents the case where the author has yet to implement the logic at this point in the program. This can act as an exception based TODO tag.
所以这是一种懒惰的方法,可以为所有 CustomerQueryService
的方法提供实现,只是为了在运行时发现您尚未编写它。
注意 UnsupportedOperationException
在 一些 情况下可能是可以接受的,但对于项目来说都不是一个好的 "convention"。