如何有一个接受接口的构造函数?

时间:2019-04-18 13:04:42

标签: java

我正在尝试通过一些编码挑战来学习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 个答案:

答案 0 :(得分:6)

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

编辑: 如果要使用接口而不是MapAlertDAO来使用AlertService类,请按以下方式使用它:

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。

答案 1 :(得分:2)

以这种方式更改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());
    }
}