Java 界面太笼统了

Java 界面太笼统了,java,interface,Java,Interface,在我使用的Java代码中,我们有一个接口来定义数据访问对象(DAO)。大多数方法都采用数据传输对象(DTO)的参数。当DAO的实现需要引用特定类型的DTO时,就会出现问题。然后该方法需要(对我来说)将DTO转换为SpecificDTO,这是完全不必要的。不仅如此,编译器还不能对DAO的特定实现强制执行任何类型的类型检查,因为DAO只能将其特定类型的DTO作为参数。 我的问题是:如何以尽可能小的方式修复此问题?您可以使用泛型: DAO<SpecificDTO> dao = new Sp

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

您可以使用泛型:

DAO<SpecificDTO> dao = new SpecificDAO();
dao.save(new SpecificDTO());
etc.
DAO-DAO=newspecificdao();
save(新的SpecificDTO());
等
您的DAO类将如下所示:

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

class SpecificDAO implements DAO<SpecificDTO> {
    void save(SpecificDTO) {
        // implementation.
    }
    // etc.
}
接口DAO{
无效保存(T);
}
类SpecificDAO实现DAO{
作废保存(SpecificDTO){
//实施。
}
//等等。
}

SpecificDTO将扩展或实现DTO。

对泛型进行重构不是一件容易的事(即使这很可能是值得的)

如果代码像这样使用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
    }
}

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

谢谢。起初我看不太清楚,但在与编译器进行了一些讨论之后,一切都变得清晰起来。