3

在我正在使用的 Java 代码中,我们有一个接口来定义我们的数据访问对象 (DAO)。大多数方法采用数据传输对象 (DTO) 的参数。当 DAO 的实现需要引用特定类型的 DTO 时,就会出现问题。然后该方法需要执行一个(对我来说完全不必要的 DTO 到 SpecificDTO 的强制转换。不仅如此,编译器也不能对 DAO 的特定实现强制执行任何类型的类型检查,它应该只将它们的特定类型作为参数DTOs. 我的问题是:我如何以最小的方式解决这个问题?

4

2 回答 2

12

您可以使用泛型:

DAO<SpecificDTO> dao = new SpecificDAO();
dao.save(new SpecificDTO());
etc.

你的 DAO 类看起来像:

interface DAO<T extends DTO> {
    void save(T);
}

class SpecificDAO implements DAO<SpecificDTO> {
    void save(SpecificDTO) {
        // implementation.
    }
    // etc.
}

SpecificDTO 将扩展或实现 DTO。

于 2008-10-16T20:56:20.817 回答
0

重构为泛型是不小的痛苦(尽管它很可能是值得的)。

如果代码像这样使用您的 DTO 接口,这将特别可怕:

DTO user = userDAO.getById(45);

((UserDTO)user).setEmail(newEmail)

userDAO.update(user);

我已经看到了这一点(以更微妙的方式)。

你可以这样做:

public DeprecatedDAO implements DAO
{
    public void save(DTO dto)
    {
        logger.warn("Use type-specific calls from now on", new Exception());
    }
}

public UserDAO extends DeprecatedDAO
{
    @Deprecated
    public void save(DTO dto)
    {
        super.save(dto);
        save((UserDTO)dto);
    }

    public void save(UserDTO dto)
    {
        // do whatever you do to save the object
    }
}

这不是一个很好的解决方案,但可能更容易实现;你的遗留代码应该仍然可以工作,但它会产生警告和堆栈跟踪来帮助你找到它们,并且你也有一个类型安全的实现。

于 2008-10-17T16:13:13.523 回答