如何从类中隐藏不受支持的接口方法

时间:2019-04-05 22:16:51

标签: java interface

我有一个界面:

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()方法,以表明没有人可以在代码中使用此不受支持的方法(例如,通过注释?)。还是我必须为这种情况创建另一个模式?

3 个答案:

答案 0 :(得分:3)

Service接口(根据您的描述)明显违反了接口隔离原则(ISP)。您应该为Service1Service2有两个接口。如果需要聚合,则可以通过名为AggregatedService的接口来进行聚合,该接口将扩展Service1Service2

根据当前的设计,不可能仅对外部系统隐藏一种方法。

答案 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)

实现从其实现的接口继承所有方法。因此,如果创建此实现的实例,则可以访问此实现和实现的接口中的所有(非私有)方法。