Как иметь конструктор, который принимает интерфейс?

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

Я написал интерфейс и теперь нужно написать конструктор в классе AlertService, который принимает этот интерфейс (AlertDAO). Я не очень понимаю концепцию.

Кто-нибудь может объяснить?

Я добавил интерфейс и добавил конструктор, но не знаю, как заставить этот конструктор ПРИНИМАТЬ новый интерфейс? Надеюсь, я имею смысл.

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

class AlertService {
    private final MapAlertDAO storage = new MapAlertDAO();

    public UUID raiseAlert() {
        return this.storage.addAlert(new Date());
    }

    public Date getAlertTime(UUID id) {
        return this.storage.getAlert(id);
    }

}

interface AlertDAO {

    public UUID addAlert(Date time);
    public Date getAlert(UUID id);

}

class MapAlertDAO implements AlertDAO {
    private final Map<UUID, Date> alerts = new HashMap<UUID, Date>();

    public UUID addAlert(Date time) {
        UUID id = UUID.randomUUID();
        this.alerts.put(id, time);
        return id;
    }

    public Date getAlert(UUID id) {
        return this.alerts.get(id);
    }
}
public AlertService(AlertDAO ad)?
Federico klez Culloca 18.04.2019 15:06

Похоже, вы не знаете, что означает слово "принимает" в данном контексте. Это означает, что он принимает AlertDAO в качестве параметра. См. комментарий Федерико выше.

Jesper 18.04.2019 15:07

вы можете сделать это, передав интерфейс в параметре конструктора или установив его с помощью сеттера/геттера. Вы можете узнать больше об этом в этом блоге medium.freecodecamp.org/…

Muhammad Ahmed 18.04.2019 15:09

@nsonline почему? AlertService не AlertDAO, это имеетAlertDAO. Это важное отличие и причина, по которой большая часть объектно-ориентированного кода отстой.

Federico klez Culloca 18.04.2019 15:12

@FedericoklezCulloca - Хорошо, хорошо, но MapAlertDAO реализовал AlertDAO, и он также создает MapAlertDAO() в AlertService, зачем нужно и то, и другое? Почему бы не передать MapAlertDAO в конструкторе и не вызывать методы интерфейса, когда они вам нужны.

user11360922 18.04.2019 15:15

@nsonline Это другая проблема. Вероятно, правильным способом сделать это было бы объявить storage как AlertDAO. Если бы мы сохранили его как MapAlertDAO, AlertDAO был бы совершенно бесполезен (в показанном здесь контексте), и этого вопроса не было бы с самого начала :)

Federico klez Culloca 18.04.2019 15:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
2 509
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Конструктор AlertService:

public AlertService() {
}

Конструктор предназначен для создания объекта класса, например:

AlertService alertService = new AlertService();

Если вы хотите добавить AlertDAO в конструктор, это будет выглядеть так:

public AlertService(AlertDAO alert){
    // do something with alert
}

Конструктор в Java — это специальный метод, который используется для инициализации объектов. Конструктор вызывается при создании объекта класса. Его можно использовать для установки начальных значений атрибутов объекта. ссылка: https://www.w3schools.com/java/java_constructors.asp

Редактировать: Если вы хотите, чтобы класс AlertService использовал интерфейс вместо MapAlertDAO, используйте его следующим образом:

class AlertService {
    private AlertDAO storage;

    public AlertService(AlertDAO alert) {
        this.storage = alert;
    }

    public UUID raiseAlert() {
        return this.storage.addAlert(new Date());
    }

    public Date getAlertTime(UUID id) {
        return this.storage.getAlert(id);
    }

}

Теперь вы можете передать свой MapAlertDAO в AlertService.

Спасибо за все комментарии. Думаю, мне все еще нужно усердно работать над пониманием этих концепций.

RShome 18.04.2019 15:23

Измените класс AlertService следующим образом:

class AlertService {
    private final AlertDAO storage;

    public AlertService(AlertDAO alertDAO){
        storage = alertDAO;
    }

    public UUID raiseAlert() {
        return this.storage.addAlert(new Date());
    }

    public Date getAlertTime(UUID id) {
        return this.storage.getAlert(id);
    }

}

Затем вы можете передать реализацию вашего интерфейса AlertDAO конструктору вашего класса AlertService, когда вы создаете его объект в любом другом классе. Например:

public class MainClass{
    public static void main(String[] args){
        AlertService alertService = new AlertService(new MapAlertDAO());
    }
}

Другие вопросы по теме