【问题标题】:hidding api with interfaces in Java在Java中隐藏带有接口的api
【发布时间】:2011-02-20 19:08:57
【问题描述】:

有人可以解释一下“用 Java 中的接口隐藏 api”是什么意思吗? 如何通过接口使用 API 函数? 我需要一个小的工作示例来了解接口如何隐藏 api 非公共部分,以及如何同时使用 api 公开部分。

提前致谢。

感谢大家的快速回复,请给我时间考虑答案。
最后但并非最不感谢您的时间和努力!

II.我的第二个问题是:下面这个案例的背景是什么?

IBinaryOperation op = BinaryOperationProvider.getOperation("multiply");

or 

List<String> myList = new LinkedList<String>();

我不清楚,因为接口由方法的声明组成,这就是为什么我不明白上面几行中可能发生的事情。 使用的接口的空方法和对象之间的相等性有什么意义吗? 对不起我的英语不好。

【问题讨论】:

    标签: java api interface


    【解决方案1】:

    例如,您可以声明并创建一个字符串列表,如下所示:

    List<String> myList = new LinkedList<String>();
    

    ListmyList 的类型。它是一个接口。这意味着对myList 方法的所有后续调用都将通过接口完成:您只能调用在List 接口中声明的方法。

    然而,对象的具体类是LinkedList,它包含更多方法,其中一些反映了链表的结构(例如addFirstaddLast)。但由于您声明变量的方式,这些方法是隐藏的。您选择通过给定的(限制性)接口访问对象。

    这可能看起来有限制,但这也意味着您可以随时更改代码,并将具体类LinkedList 替换为任何其他实现List 接口的类,例如ArrayList

    【讨论】:

    • 感谢您的回复,如果您有时间可以回答我的第二个问题,请看第二个。部分。
    • 实际上只有 concrete 类的实例是在运行时创建的。相反,编译器使用接口来执行静态类型检查。因此,编译器会检测您是否尝试调用隐藏方法。
    【解决方案2】:

    通常在公开 API 时,应尽可能隐藏实现细节,并通过简单的接口将其公开。

    例如假设您提供了一个用于将两个数字相加的 api。

    Soln1 (Bad soln)给客户端下面的类

    public class Adder {
        public void setA() {..}
    
        public void setB() {..}
    
        public int add() { return A + B; }  
    }
    

    Soln 2(更好的soln):给客户端如下接口。

    public interface Adder {
        public int add(int a, int b);
    
    }
    

    现在为什么解决方案 2 是更好的解决方案。如果你给了用户第一个解决方案。客户端绑定到类 Adder。假设稍后您有一个新的加法实现,可以在云中添加数字(想象力丰富:)),您可能必须作为客户更改他们的代码以使用新类。

    如果你只是给他们接口,你可以提供许多实现,并有一个工厂机制来选择合适的实现。

    【讨论】:

    • 由于知识匮乏,无法想象在现实中是如何使用的。
    • 感谢您的回复,如果您有时间可以回答我的第二个问题,请看二。部分。
    【解决方案3】:

    这是一个使用接口的非常简单的示例:

    public interface IBinaryOperation {
        public int performOp(int a, int b);
    }
    
    private class MultiplicationProvider implements IBinaryOperation {
        public int performOp(int a, int b) {
            return a * b;
        }
    }
    
    public class BinaryOperationProvider {
        static IBinaryOperation getOperation(String name) {
            if ("multiply".equals(name)) {
                return new MultiplicationProvider();
            } else if ("add".equals("name)) {
                return new AdditionProvider();
            } // ...
        }
    }
    

    你可以这样使用:

    IBinaryOperation op = BinaryOperationProvider.getOperation("multiply");
    int c = op.performOp(a, b);
    

    在上面的例子中,MultiplicationProvider 对 API 的实现是完全私有的。唯一的公共部分是IBinaryOperation 接口和BinaryOperationProvider 类。

    【讨论】:

    • 感谢您的回复,如果您有时间可以回答我的第二个问题,请看二。部分。
    【解决方案4】:

    需要明确的是,“隐藏”的不是 API,而是实现。 List 的大多数客户端(使用上面的示例)不需要知道实际使用的是哪种 List。 (就像大多数 TCP/IP 客户端不需要知道任何关于他们正在使用的网络的特别信息 - 只是它支持标准连接抽象。)

    【讨论】:

    • 感谢您的回复,如果您有时间可以回答我的第二个问题,请看第二个。部分。
    • 恐怕很难理解。在“new LinkedList”的情况下,代码正在创建一个实现接口的类的实例。另一方面,它调用了一些提供接口实现的未知方法。不知道对你有没有帮助。
    • 你好万斯,我明白我们使用时会发生什么: List myList = new LinkedList();它只是将类型化引用 (LinkedList) 分配给类似的引用 List。相似,因为他们使用的是一些接口。简而言之,它是关于相互分配相同类型的引用感谢您的时间和精力。
    猜你喜欢
    • 2016-01-14
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2013-12-08
    • 2015-06-20
    相关资源
    最近更新 更多