【背景介绍】
【接口介绍】基于springboot的在线解冲突平台,查询冲突文件接口,返回所有冲突文件;
【需求】返回里面包含的二进制冲突文件
【问题现象】
清楚的是二进制文件<冲突文件总数,实际返回的冲突文件总数等于二进制冲突文件
【原始代码】
class FileTree{
String path;//文件路径
String fileName;//文件名
String fileType;//类型:direction、file
List<FileTree> children;
int conflictNum;
int isBinary;//0或1
//其他省略
}
//获取二进制文件
public List<FileTree> getBinaryFile(List<FileTree> files){
List<FileTree> binaryFiles = new ArrayList<>();
for(FileTree fileTree:files){
if("direction".equals(fileTree.fileType){
List<FileTree> tmp = getBinaryFile(fileTree.children);
if(!tmp.isEmpty()){
fileTree.children = tmp;//******
binaryFiles.add(fileTree);
}
}else{
if(fileTree.isBinary==1){
binaryFiles.add(fileTree);
}
}
}
}
【问题原因】
这里//******直接对原始冲突文件列表的children进行了重置
【修改代码】
class FileTree{
String path;//文件路径
String fileName;//文件名
String fileType;//类型:direction、file
List<FileTree> children;
int conflictNum;
int isBinary;//0或1
//其他省略
public FileTree clone(){
FileTree fileTree = new FileTree();
fileTree.path = this.path;
fileTree.fileName = this.fileName;
fileTree.fileType = this.fileType;
fileTree.children = this.children;
fileTree.conflictNum = this.conflictNum;
fileTree.isBinary = this.isBinary;
return fileTree;
}
}
//获取二进制文件
public List<FileTree> getBinaryFile(List<FileTree> files){
List<FileTree> binaryFiles = new ArrayList<>();
for(FileTree fileTree:files){
FileTree fileTreeNew = fileTree.clone();
if("direction".equals(fileTree.fileType){
List<FileTree> tmp = getBinaryFile(fileTree.children);
if(!tmp.isEmpty()){
fileTreeNew.children = tmp;//******
binaryFiles.add(fileTreeNew);
}
}else{
if(fileTree.isBinary==1){
binaryFiles.add(fileTreeNew);
}
}
}
return binaryFiles;
}
参考自:Java 对象的浅拷贝和深拷贝