在我正在使用的Java代码中,我们有一个界面来定义我们的数据访问对象(DAO)。大多数方法都采用数据传输对象(DTO)的参数。当DAO的实现需要引用特定类型的DTO时,会出现问题。然后该方法需要做一个(对我完全不必要的DTO转换为SpecificDTO。不仅如此,但编译器不能对DAO的特定实现强制执行任何类型的类型检查,DAO的特定实现应仅作为其特定类型的参数。 DTO的。 我的问题是:我如何以尽可能小的方式解决这个问题?
答案 0 :(得分: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。
答案 1 :(得分: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
}
}
这不是一个伟大的解决方案,但可能更容易实现;您的遗留代码应该仍然可以工作,但是它会产生警告和堆栈跟踪以帮助您查找它们,并且您也有类型安全的实现。