我有一个界面:
public interface Service {
default Type service1(Type t) throws IOException {
throw new UnsupportedOperationException();
}
default Type service2(Type t) throws IOException {
throw new UnsupportedOperationException();
}
}
和实现此接口的类,但只需要service2:
class MyService implements Service{
@Override
Type service2(Type t) throws IOException {
...
}
}
然后我创建一个myservice-instance:
Service s = new MyService();
s.service1(t); // throws error at runtime
是否有更好的方法隐藏或标记该service1()方法,以表明没有人可以在代码中使用此不受支持的方法(例如,通过注释?)。还是我必须为这种情况创建另一个模式?
答案 0 :(得分:3)
Service
接口(根据您的描述)明显违反了接口隔离原则(ISP)。您应该为Service1
和Service2
有两个接口。如果需要聚合,则可以通过名为AggregatedService
的接口来进行聚合,该接口将扩展Service1
和Service2
。
根据当前的设计,不可能仅对外部系统隐藏一种方法。
答案 1 :(得分:0)
使用Deprecated
批注。这告诉其他开发人员,该方法不再受支持,并且计划在将来的版本中删除。您的新界面可能如下所示:
public interface Service {
@Deprecated
default Type service1(Type t) throws IOException {
throw new UnsupportedOperationException();
}
default Type service2(Type t) throws IOException {
throw new UnsupportedOperationException();
}
}
它不仅会为在编译期间使用它的人提出警告,还会突出显示,告诉人们他们在大多数现代IDE中正在使用已弃用的Api。
答案 2 :(得分:0)
实现从其实现的接口继承所有方法。因此,如果创建此实现的实例,则可以访问此实现和实现的接口中的所有(非私有)方法。