【问题标题】:Is it possible to create an object for an interface type是否可以为接口类型创建对象
【发布时间】:2011-03-11 10:26:36
【问题描述】:
Connection con = DriverManager.getConnection("jdbc:odbc:MyDataSource1");

这是一条 JDBC 编程线。在这一行中,我们正在为Connection 接口创建一个对象。怎么可能?

【问题讨论】:

  • “怎么可能”使用一行代码?将其放入您的应用程序中!
  • 复制编辑;如果不正确,请恢复。

标签: java jdbc interface database-connection driver


【解决方案1】:

接口是“con”变量的引用类型。接口的实现来自您为问题注册的 JDBC 驱动程序。 DriverManager 在 java.sql 中返回 Connection 和所有其他接口类型的驱动程序实现。

【讨论】:

    【解决方案2】:

    赋值右侧生成的对象是 Connection 的子类型:实现 Connection 接口的 Class 的实例。您不需要知道确切的类型是什么,因此您可以使用具有不同连接字符串的同一行并接收 MySqlConnection、DB2Connection、OracleConnection 或 WhatHaveYouConnection 实例,这些实例可以正确处理您进行的后续数据库调用通过 con 变量。

    例如,参见:

    What does it mean to "program to an interface"?

    What exactly is "interface based programming"?

    What does "program to interfaces, not implementations" mean?

    【讨论】:

      【解决方案3】:

      DriverManager.getConnection("jdbc:odbc:MyDataSource1"); 以某种方式创建了一个实现 Connection 接口的对象。

      只要返回的对象是Connection 类型,您就可以通过Connection 类型的变量来持有对它的引用。您无需关心实际对象是什么,只要它是 Connection - 也就是说,返回的对象实现了 Connection 接口。

      原理和e.g.一样

      public interface Instrument {
        public void play();
      }
      
      public class Vuvuzela implements Instrument {
      
        public void play() {
           System.out.println("Bzzzzzzzzzzzzzz");
      }
      
      ...
      public static Instrument getInstrument(String name) {
       if("Vuvuzela".equals(name)) {
          return new Vuvuzela();
       } 
       return null;
      }
      
      ...
      //get an instrument, we don't care what the actual object
      //is as long as it is an Instrument.
      //in this case the instrument variable will "point" to n
      //Vuvuzela object but we don't need to care about that
      Instrument instrument = getInstrument("Vuvuzela");
      intrument.play();
      

      【讨论】:

      • 这应该是:while (true) { System.out.println("Bzzzzzzzzzzzzzz"); }
      • getInstrument() 应该返回一个 NOPIstrument 而不是 null。否则你将在某天凌晨 3 点调试 NullPointerExceptions。
      【解决方案4】:

      DriverManager.getConnection() 是一个static factory method,它返回一个实现Connection 接口的类的实例。这种方法允许programming to an interface 减少依赖,还讨论了here

      【讨论】:

        【解决方案5】:

        您需要了解 Java 接口是一个契约:实现该接口的对象承诺拥有该接口中呈现的所有东西!

        对象还能做什么,与这个特定的接口无关,实际上通常情况下,给定接口有多个可能的候选者,而调用代码基本上不关心(或需要 关心)它收到哪一个。

        在 JDBC 案例中,您要求建立数据库连接,DriverManager 根据您传递的字符串选择一个并将其返回给您。所有需要知道的是,你得到的那个拥有 Connection 接口契约中列出的所有方法,然后你可以根据需要使用它们。

        所以,当一个接口在 LEFT 侧用于赋值时,它只是意味着你可以得到任何对象,只要它实现了接口。当在左侧使用一个类时,您必须呈现该类(或子类)的一个对象,该对象已被证明具有更多限制性。

        【讨论】:

          猜你喜欢
          • 2020-08-26
          • 1970-01-01
          • 2020-08-23
          • 2018-09-06
          • 2013-01-09
          • 2018-08-19
          • 2021-08-18
          • 2016-09-25
          相关资源
          最近更新 更多