Arhn - архитектура программирования

Объект интерфейса JDBC в java

Если интерфейсы не могут быть созданы, то как мы можем создавать объекты интерфейса Statement в JDBC?

Я пошел к документации Oracle Java, он показывает:

public interface Statement
extends Wrapper, AutoCloseable

Я предполагаю, что приведенный ниже код создает ссылочную переменную, но мне нужно правильное объяснение, которое я нигде не могу найти.

Statement stmt = con.createStatement();

Если это интерфейс, то как он может определять тела методов? Явно не класс.

20.05.2019

  • Интерфейсы в основном похожи на кости, это простые кости, которые, например, отличают человеческую кость от кости тигра. Когда вы добавляете мышцы, ткани, кровеносные сосуды, кожу, цвет, объявляете некоторые специфические действия/поведения, такие как ходьба, еда, мышление и т. д., это то, что вы в основном делаете при реализации интерфейса... Это общая концепция интерфейса. 20.05.2019
  • Все, что вы можете сказать из кода, вырезанного Statement stmt = con.createStatement();, это то, что некоторый класс, реализующий интерфейс подключения, вызывает свой метод createStatement и возвращает другой класс, реализующий интерфейс Statement. Какие реальные классы реализации стоят за этими интерфейсами, неизвестно и в данном контексте не важно. 20.05.2019
  • Спасибо, @OHGODSPIDERS, вы немного прояснили и с логической точки зрения. Я немного разбираюсь в Java, но мне было интересно узнать какое-то описание, которое вы предоставили. Очевидно, мне нужно провести некоторые исследования и отладить некоторые программы, чтобы полностью понять это. Благодарю вас! 20.05.2019

Ответы:


1

В вашем примере con.createStatement() будет возвращать экземпляр некоторого класса, реализующего интерфейс Statement.

con предположительно является конкретным экземпляром класса, который реализует java.sql.Connection, и эта конкретная реализация Connection определяет, какой тип Statement он должен возвращать.

Самый простой способ увидеть это — запустить свой код с помощью отладчика, и вы сможете увидеть фактический тип, которым является stmt во время выполнения. Этот тип будет чем-то, что реализует Statement.

Чтобы дать очень простой пример того, как это может работать для воображаемой базы данных с именем «SomeDatabase», у вас есть интерфейс Statement, который вы показали выше:

public interface Statement extends Wrapper, AutoCloseable

и интерфейс Connection:

public interface Connection extends Wrapper, AutoCloseable

Предположим, что con является экземпляром конкретного класса с именем SomeDatabaseConnection, который реализует метод createStatement, потому что это требуется для интерфейса Connection. Реализация createStatement возвращает экземпляр конкретного класса, реализующего Statement, характерного для SomeDatabase:

public class SomeDatabaseConnection implements Connection {
    public Statement createStatement() {
        return new SomeDatabaseStatement();
    }
}

Теперь мы можем сказать:

Connection con = new SomeDatabaseConnection();
Statement stmt = con.createStatement();

Надеюсь, здесь вы видите, что фактически возвращаемый конкретный класс является экземпляром SomeDatabaseStatement, который реализует Statement.

Весь смысл всего этого в том, что детали могут быть скрыты от кода вашего приложения; не имеет значения, предоставлены ли ваши Connection или Statement Oracle, MySQL или SomeDatabase, функциональность, которую они предоставляют, гарантируется интерфейсами, для которых вы разрабатываете, поэтому вы можете легко переключаться с одной базы данных на другую, не меняя свою собственную код вообще.

Терминология

Хотя фактический конкретный класс stmt является каким-то конкретным классом (SomeDatabaseStatement в моем глупом примере), мы все же можем сказать, что это "оператор", поскольку он соответствует всем требованиям интерфейса Statement.

Кроме того, поскольку интерфейс Statement расширяет Wrapper и AutoCloseable, мы можем сказать, что stmt «является оболочкой» и «является AutoCloseable», поскольку мы знаем, что он также должен соответствовать требованиям обоих этих интерфейсов.

Ваша линия:

Statement stmt = con.createStatement();

Может быть записано как:

MyDatabaseStatement stmt = con.createStatement();

но также было бы так же правильно написать, как:

Wrapper stmt = con.createStatement();

or

AutoCloseable stmt = con.createStatement();

Очевидный следующий вопрос: какой из них мы должны выбрать? Простой ответ на этот вопрос: тот, который дает вам всю необходимую функциональность, и не более того.

В этом конкретном примере в большинстве случаев это будет Statement, потому что интерфейс Statement предоставляет вам все полезные методы для взаимодействия с базой данных. Однако, если по какой-то причине вам нужно было вызвать только метод close(), который определен в интерфейсе AutoCloseable, то, вероятно, было бы лучше использовать AutoCloseable вместо Statement.

Чтобы узнать больше о том, почему это хорошо, прочитайте о принципе инверсии зависимостей.

20.05.2019
  • Большое спасибо! Теперь я понял, вы и ваше объяснение потрясающие. не могу найти лучшего ответа, чем этот. Итак, просто для подтверждения, stmt на самом деле является объектом, но не самим интерфейсом Statement, а каким-то подклассом, который его реализует? 20.05.2019
  • @AniketKariya да, тип stmt будет классом, реализующим интерфейс Statement 20.05.2019
  • @AniketKariya, правильно - посмотрите мое редактирование, чтобы добавить немного о терминологии - надеюсь, это не просто запутает вас! 21.05.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..