Я пытаюсь изучить 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);
    }
}
2
RShome 18 Апр 2019 в 16:04

2 ответа

Лучший ответ

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

public AlertService() {
}

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

AlertService alertService = new AlertService();

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

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

Конструктор в Java - это специальный метод, который используется для инициализации объектов. Конструктор вызывается при создании объекта класса. Может использоваться для установки начальных значений для атрибутов объекта ref: 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.

7
KeeyPee 18 Апр 2019 в 13:10

Измените класс 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());
    }
}
2
Monac 18 Апр 2019 в 13:19