【发布时间】:2017-07-11 03:18:05
【问题描述】:
最近我遇到了这段代码。
public interface CustomerQueryService {
default Customer getCustomerById(long id) {
throw new NotImplementedException();
}
}
后来,事实证明这是这个项目的一般惯例。 它被认为是一种好的做法吗?
【问题讨论】:
-
因此,虽然您概述的用法通常是可以接受的(这是“可选方法”的习惯用法),但这是您项目中的“一般约定”这一事实是一个巨大的尖叫危险信号。为了正确看待这一点,我只使用过几次这种模式(例如,
Iterator.remove())。将其经常用作“一般约定”几乎可以肯定是过度使用。 -
更一般地说,经常使用这种约定实际上是将“实现接口”从静态类型属性降级为动态类型属性。这总是会在毫无戒心和不值得的用户手中爆炸,因为他们有理由相信“implements Foo”真的意味着“implements Foo”。真正的选择性是罕见的;像这样对待它。
-
@BrianGoetz 并记录在案;有你在场,我感到非常荣幸;-)
标签: java exception interface java-8 default-method