Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编码到接口?_Java_Oop_Spring_Guice_Aspect Oriented - Fatal编程技术网

Java 编码到接口?

Java 编码到接口?,java,oop,spring,guice,aspect-oriented,Java,Oop,Spring,Guice,Aspect Oriented,我想巩固我对“编码到接口”概念的理解。据我所知,我们创建接口来描述预期的功能,然后在具体的类中实现这些“契约”。要使用接口,只需在具体类的实例上调用方法即可 显而易见的好处是了解具体类提供的功能,而不管其具体实现如何 基于上述情况: 在我对“接口编码”的理解中是否存在错误 对我错过的接口编码有什么好处吗 谢谢。只有一个可能的更正: 要使用接口,只需在具体类的实例上调用方法即可 我们可以在类型接口的引用上调用方法,该接口恰好使用具体类作为实现: List<String> l = new

我想巩固我对“编码到接口”概念的理解。据我所知,我们创建接口来描述预期的功能,然后在具体的类中实现这些“契约”。要使用接口,只需在具体类的实例上调用方法即可

显而易见的好处是了解具体类提供的功能,而不管其具体实现如何

基于上述情况:

  • 在我对“接口编码”的理解中是否存在错误
  • 对我错过的接口编码有什么好处吗

  • 谢谢。

    只有一个可能的更正:

    要使用接口,只需在具体类的实例上调用方法即可

    我们可以在类型接口的引用上调用方法,该接口恰好使用具体类作为实现:

    List<String> l = new ArrayList<String>();
    l.add("foo");
    l.add("bar");
    
    listl=newarraylist();
    l、 添加(“foo”);
    l、 添加(“酒吧”);
    
    如果您决定切换到另一个列表实现,则客户端代码不会发生更改:

    List<String> l = new LinkedList<String>();
    
    List l=newlinkedlist();
    
    这对于隐藏实现细节、自动生成代理等特别有用


    您会发现框架喜欢并鼓励编程到接口。它是编程、自动生成事务管理代理等想法的基础。

    您没有列出如何实现接口的部分,这一部分很重要。如果使用构造函数显式实例化实现类,那么代码将绑定到该实现。您可以使用工厂为您获取一个实例,但是您与工厂的联系就像以前与实现类的联系一样紧密。第三种选择是使用依赖项注入,即让工厂将实现对象插入到使用它的对象中,在这种情况下,可以避免将使用对象的类绑定到实现类或工厂。

    主要优点是使用接口将类与其依赖项松散耦合。然后,您可以更改一个类,或实现一个新的具体接口实现,而无需更改依赖于它的类。

    针对接口进行编码的目的是将代码与正在使用的具体实现解耦。也就是说,您的代码不会对具体类型进行假设,只会对接口进行假设。因此,无需调整代码即可交换具体的实现。

    我想您可能已经暗示了这一点,但我相信对接口进行编码的最大好处之一是您正在打破对具体实现的依赖。您可以实现松散耦合,并且在不更改太多代码的情况下更容易切换出特定的实现。如果您只是在学习,我会看看各种各样的方法,以及它们是如何通过对接口进行编码来解决问题的。读这本书对我来说真的很有帮助

    要使用接口,只需在具体类的实例上调用方法即可

    通常,将变量类型化为接口类型,因此只允许访问接口中定义的方法

    显而易见的好处是了解具体类提供的功能,而不管其具体实现如何

    有点。最重要的是,它允许您编写带有接口类型的参数的API。API的用户可以传入他们自己的类(实现这些接口),您可以编写这些类,即使它们在编写时还不存在(例如java.util.Arrays.sort(),它能够对实现
    可比的
    或带有合适的
    比较器的任何对象进行排序)


    从设计角度来看,接口允许/强制API契约和实现细节之间的明确分离。

    您的理解似乎是正确的。你的同事刚从你的办公桌旁走过,把你喝醉了的老板主演的圣诞晚会的最新照片都放在他的拇指驱动器上。你和你的同事对这个拇指驱动器的工作原理没有三思而后行,对你来说它是一个黑匣子,但你知道它的工作原理是因为USB接口

    不管它是SanDisk还是钛合金(甚至不确定它是一个品牌),尺寸/颜色也不重要。事实上,唯一重要的是它没有损坏(可读),并且它插入USB

    您的USB拇指驱动器遵守合同,它本质上是一个接口。我们可以假设它履行了一些非常基本的职责:

  • 插入USB
  • 遵守合同方法CopyDataTo:

    公共接口IUSB{ void CopyDataTo(string somePath);//用于将数据从缩略图驱动器复制到。。。 }

  • 遵守合同方法CopyDataFrom:

    公共接口IUSB{ void CopyDataFrom();//用于将数据从PC复制到缩略图驱动器 }

  • 好的,也许不是那些方法,但IUSB
    接口只是一个契约,缩略图驱动器供应商必须遵守该契约,以确保跨各种平台/供应商的功能。因此,SanDisk通过界面制作thumbdrive:

    public class SanDiskUSB : IUSB
     {
      //todo: define methods of the interface here
     }
    
    Ari,我认为您已经对接口的工作方式有了坚实的理解(从它听起来的样子)

    据我所知,我们创建接口来描述预期的功能,然后在具体的类中实现这些“契约”

    我在你的思维中看到的唯一一种变异是——你将调用预期的契约,而不是预期的功能。该功能在具体类中实现。接口仅声明您将能够调用实现具有预期方法签名的接口的东西。功能对调用对象隐藏

    SoundMaker sm = new Duck();<br/> SoundMaker sm1 = new ThunderousCloud(); sm.makeSound(); // quack, calls all sorts of stuff like larynx, etc.<br/> sm1.makeSound(); // BOOM!, completely different operations here...