如何正确声明某些实现可能不支持的接口方法?

时间:2017-02-16 01:58:29

标签: java interface api-design

这是我问another question的逻辑发展。

据说你有一个接口,某些方法可能由具体实现支持或不支持。目标是为客户提供一种合理的方式,以确定他的特定实现是否支持每种特定方法,如果不是,则可以恢复。

我提出的解决方案使用标准java.lang.UnsupportedOperationException,如果方法不受支持,则由具体实现抛出:

public interface CommonInterface {
    void possiblyUnsupportedOperation () throws java.lang.UnsupportedOperationException;
}

然而,这被认为是一个糟糕的解决方案,因为异常机制不应该用作检查操作是否可用的手段。所以另一种建议是使用测试方法:

public interface CommonInterface {
    void possiblyUnsupportedOperation ();
    boolean isOperationSupported ();
}

但是如果界面有很多可选操作怎么办?我应该使用多个测试仪功能吗?我应该创建一个单独的Enum来将可选方法映射到一个测试器函数并将其作为方法描述符传递给它吗?两种变体看起来都很笨重。

是否有另一种方式既优雅的代码又是优秀的设计解决方案?

1 个答案:

答案 0 :(得分:0)

如果您拥有该接口,则可以使用始终要实现的方法提取Parent接口,并从该接口继承。

public interface ParentCommonInterface {
    void method1();
    void method2();
}

public interface CommonInterface extends ParentCommonInterface {
    void possiblyUnsupportedOperation();
}

class MyClass implements ParentCommonInterface {...}

如果您不拥有该界面,则可以创建一个Adapter类并使用该类声明该对象。

public interface CommonInterface {

    void possiblyUnsupportedOperation();
        boolean isOperationSupported();
    }

    public class AdapterClassOne implements CommonInterface {
        void possiblyUnsupportedOperation() {...}
        boolean isOperationSupported() {return false;}
    }
}