Можно ли создать объект для типа интерфейса - PullRequest
1 голос
/ 03 июля 2010
Connection con = DriverManager.getConnection("jdbc:odbc:MyDataSource1");

Это строка программирования JDBC. В этой строке мы создаем объект для интерфейса Connection. Как это возможно?

Ответы [ 5 ]

7 голосов
/ 03 июля 2010

Интерфейс является ссылочным типом для вашей переменной "con".Реализация интерфейса происходит от драйвера JDBC, который вы зарегистрировали для своей проблемы.DriverManager возвращает реализацию драйвера для Connection и всех других типов интерфейса в java.sql.

3 голосов
/ 03 июля 2010

Объект, который создает правая часть назначения, является подтипом Connection: экземпляр класса, который реализует интерфейс Connection. Вам не нужно знать точный тип, в результате чего вы можете использовать одну и ту же строку с разными строками подключения и получить экземпляр MySqlConnection, DB2Connection, OracleConnection или WhatHaveYouConnection, который правильно обрабатывает последующие вызовы базы данных, которые вы делаете через переменную con .

См., Например:

Что значит «программировать на интерфейс»?

Что такое «интерфейсное программирование»?

Что означает «программировать на интерфейсы, а не на реализации»?

2 голосов
/ 03 июля 2010

DriverManager.getConnection("jdbc:odbc:MyDataSource1"); каким-то образом создает объект, который реализует интерфейс Connection.

Пока возвращаемый объект имеет тип Connection, вы можете хранить ссылку на него через переменную с Connectionтип.Вам не нужно заботиться о фактическом объекте, пока он Connection - то есть возвращаемый объект реализует интерфейс Connection.

Это тот же принцип, что, например,

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();
1 голос
/ 03 июля 2010

Вы должны понимать, что интерфейс Java - это контракт : объект, реализующий интерфейс, обещает представить все вещи в интерфейсе!

На что еще способен объект, не имеет отношения к этому конкретному интерфейсу, и на самом деле часто случается, что для данного интерфейса существует несколько возможных кандидатов, и вызывающему коду в основном не важно (или нужно заботиться), какой он получает.

В случае JDBC вы запрашиваете соединение с базой данных, и DriverManager выбирает его в соответствии с переданной вами строкой и возвращает его вам.Все вы нужно знать, что один вы получаете имеют все методы, перечисленные в договоре интерфейса подключения, который вы можете использовать, как вам нужно.

1012 * Таким образом, когда интерфейс, используемый наЛЕВАЯ сторона при назначении означает, что вы можете получить любой объект, если он реализует интерфейс.Когда класс используется слева, вы должны представить объект этого класса (или подкласса), который оказался гораздо более ограничительным.
1 голос
/ 03 июля 2010

DriverManager.getConnection() - это статический фабричный метод , который возвращает экземпляр класса, который реализует интерфейс Connection.Этот подход позволяет программировать интерфейс для уменьшения зависимости, также обсуждается здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...