的方法返回部分不完整的结果,我想上的情况下的一些反馈:从抛出异常
的方法构造一个对象,但一些工作,同时构建它可能无法完成。这将导致缺少一些数据的对象。我想给这个方法的用户处理对象的能力(如果完成的话),但是如果不完整则处理对象,同时也能够处理抛出的异常。
使用案例:
我从磁盘读取一个文件到一个POJO和文件的一些属性,如创建可以抛出,而从操作系统中读取一个例外日期。在这种情况下,我抛出了一个自定义的异常,但我也希望用户能够处理不完整的文件表示(POJO)。
我的解决办法:
我用它包装抛出的异常和不完整的对象自定义异常。
我的代码:
public FileDto getFromFile(File f) throws IncompleteFileDtoException {
FileDto dto = new FileDto();
dto.setName(f.getName());
dto.setPath(f.getAbsolutePath());
dto.setDirectory(f.isDirectory());
dto.setSize(f.length());
dto.setModifiedAt(f.lastModified());
try {
BasicFileAttributes attr = Files.readAttributes(f.toPath(), BasicFileAttributes.class);
dto.setCreatedAt(attr.creationTime().toMillis());
}
catch(Exception e)
{
throw new IncompleteFileDtoException("Unable to transform " +f.getAbsolutePath() + " to DTO.", e, dto);
}
return dto;
}
public static class IncompleteFileDtoException extends Exception
{
private FileDto fileDto;
public IncompleteFileDtoException(String message, Exception e, FileDto fileDto)
{
super(message,e);
this.fileDto = fileDto;
}
public FileDto getFileDto() {
return fileDto;
}
}
会这样的代码有什么负面影响?
这听起来确实是一个有趣的补充。我能从中看到的一个好处是,Builder将对象构造过程(可能很重)委托给方法的用户,如果认为它不是必要的,他不会构造对象并且不会使用资源,对吗? –
这是正确的。它在很多情况下非常有用:例如像你的,当你在对象初始化过程中遇到问题时,或者当你想用许多最终参数来构建不可修改的对象时(而不是使用具有所有这些参数的构造函数)。 “四人帮”是关于它的很好的书。 –