例如 -
class Explorer {
private List <File> all_files = new ArrayList <File> ();
File [] explore (...) {
....
} // this function returns, after modification,
// the all_files variable declared above.
// Note :- this function is recursive.
}
我创建了一个Explorer
类的对象并调用explore
方法,对于第一次调用,这根本不会引起任何问题,我得到了我期望的结果。但是,如果我下次以类似的方式尝试使用同一个对象,那么,您已经可以预期会发生什么。基本上,explore
方法会在all_files
的末尾附加一些文件并将其返回(作为数组)。第二次调用该方法会在不先清除all_files
的情况下附加更多文件。
所以,我正在寻找一种策略,在一次使用后清除all_files
。我不能在我的方法结束时添加类似clear(all_files)的语句,因为它是递归的,all_files
是全局的。如果可能的话,我希望这个清洁过程是自动的。即,不知何故,我的程序应该在整个递归完成时清除它(如何检测?)。建议策略。
编辑:对于那些对我的策略充满好奇和怀疑的人来说,这是完整的代码(未注释) -
public class Explorer {
private List <File> all_files = new ArrayList <File> ();
private int current_index = 0;
public int depth_index;
Explorer () { depth_index = Integer.MAX_VALUE; }
Explorer (int index) { depth_index = index; }
public File[] explore (String path) {
if (++current_index > depth_index) {
return all_files.toArray(new File[0]);
}
File f = new File (path);
File[] dir_files = f.listFiles();
for (File file : dir_files) {
if (file.isFile())
all_files.add(file);
else
explore (file.getPath());
}
current_index --;
return all_files.toArray(new File[0]);
}
}
答案 0 :(得分:2)
如果在递归调用中需要List
,请在递归调用中传递它:
class Explorer {
File[] explore (...) {
return explore(..., new ArrayList<>());
}
private File[] explore(..., List<File> all_files) {
// Stuff.
}
}
答案 1 :(得分:0)
我认为您不必在此课程中保留all_files
并担心明确它。如果你真的需要一个数组,那么很容易将集合转换为数组。如果你需要不可修改的colleciton(就像数组一样),只需用Collections.unmodifiableSet()
装饰它(这是Set
,但是其他集合还有其他装饰器):
final class Explorer {
public final int depth;
Explorer() {
this(Integer.MAX_VALUE);
}
Explorer(int depth) {
this.depth = depth;
}
private static final File[] EMPTY = new File[0];
public File[] explore(String path) {
File file = new File(path);
file = file.isDirectory() ? file : file.getParentFile();
Set<File> files = addFiles(file, 0, new TreeSet<>());
return files.isEmpty() ? EMPTY : files.toArray(new File[files.size()]);
}
private Set<File> addFiles(File dir, int depth, Set<File> files) {
if (depth > this.depth)
return files;
File[] dirFiles = dir != null ? dir.listFiles() : null;
if (dirFiles == null || dirFiles.length == 0)
return files;
for (File file : dirFiles) {
if (file.isFile())
files.add(file);
else
addFiles(file, depth + 1, files);
}
return files;
}
}