在Java中隐藏带有接口的api

在Java中隐藏带有接口的api,java,api,interface,Java,Api,Interface,有人能解释一下“用Java接口隐藏api”是什么意思吗? 如何通过接口使用API函数? 我需要一个小的工作示例来理解接口如何隐藏api非公共部分,以及如何同时使用api公共部分 提前谢谢 感谢各位的快速回复,给我时间思考答案。 最后但并非最不重要的一点,感谢您的时间和努力 II.我的第二个问题是:在下面这个案例的背景下会发生什么 IBinaryOperation op = BinaryOperationProvider.getOperation("multiply"); or List&l

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

提前谢谢

感谢各位的快速回复,给我时间思考答案。
最后但并非最不重要的一点,感谢您的时间和努力

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

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

or 

List<String> myList = new LinkedList<String>();
IBinaryOperation op=BinaryOperationProvider.getOperation(“乘法”);
或
List myList=newlinkedlist();
我不清楚,因为接口由方法的声明组成,这就是为什么我不理解上面几行中可能发生的事情。 所用接口的空方法和对象之间的相等有什么意义吗?
对不起,我的英语很差。

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

List<String> myList = new LinkedList<String>();
List myList=newlinkedlist();
是myList的类型。这是一个接口。这意味着对
myList
方法的所有后续调用都将通过接口完成:您只能调用
列表
接口中声明的方法

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


它可能看起来有限制性,但也意味着您可以随时更改代码,并用实现
列表
接口的任何其他类替换具体类
LinkedList

通常在公开API时,您应该尽可能地隐藏实现细节,并通过简单的接口公开它

例如,假设您提供了一个用于添加两个数字的api

Soln1(坏的soln)为客户机提供以下类

public class Adder {
    public void setA() {..}

    public void setB() {..}

    public int add() { return A + B; }  
}
解决方案2(更好的解决方案):为客户端提供以下接口

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

}
现在为什么Soln2是一个更好的解决方案。如果您已经为用户提供了第一个解决方案,那么客户端将绑定到类加法器。假设稍后您有一个新的加法实现,可以在云中添加数字(过于想象:),您可能需要作为客户端更改代码以使用新类


相反,如果您只给他们接口,您可以提供许多实现,并使用工厂机制来选择合适的实现。

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

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
类。

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

由于我缺乏知识,我无法想象它在现实中是如何使用的。感谢您的回复,如果您有时间回答我的第二个问题,请参阅II。谢谢你的回复,如果你有时间可以回答我的第二个问题,请看II。部分。恐怕很难理解。在使用“newlinkedlist”的情况下,代码正在创建实现接口的类的实例。另一方面,它调用一些未知的方法来提供接口的一些实现。我不知道这是否对你有帮助。你好,万斯,我知道当我们使用:List myList=new LinkedList()时会发生什么;它只是将一个类型化引用(LinkedList)分配给一个类似的引用列表。类似,因为他们使用的是some界面。简而言之,这是关于相互分配相同类型的引用,感谢您的时间和努力。感谢您的回复,如果您有时间可以回答我的第二个问题,请参阅II。实际上,在运行时只创建具体类的实例。相反,编译器使用接口来执行静态类型检查。因此,编译器会检测您是否尝试调用隐藏方法。感谢您的回复,如果您有时间,您可以回答我的第二个问题,请参阅II。部分