这是我尝试在静态方法中创建数组的不良尝试。该程序的作用是列出具有特定扩展名的文档。我希望能够将它们存储在一个数组中并从main访问该数组。可能吗?到目前为止,这是我的代码:
{{1}}
我知道这是一个静态方法,并且int和数组不会被视为非静态方法,但是,我不知道如何继续进行。
答案 0 :(得分:1)
我能给你的最好的指针是离开静态领域的魔掌并进入实例 - 土地,面向对象的机会之地!
在您的主要方法中执行以下操作:
public static void main(String[] args) throws Exception {
KeywordsRecognition app = new KeywordsRecognition();
app.start();
}
然后实现start方法并在那里开始工作。这样做可以为您的代码设计提供更多选择,允许您编写更易读和可测试的代码,从而减少错误和维护问题。
要访问listFilesForFolder的结果,您可以将其返回,将其分配给字段,或将其添加到集合中。由于您正在递归,我会说:将它添加到集合中。
基本原理:每次递归都会添加到同一个集合中。您不希望中间结果对递归以外的其他代码可见,因此请避免使用字段并使用方法参数。此外,以这种方式通过递归传递数据是很常见的,因此其他开发人员将理解它。
private static final String ROOT_FOLDER_DEFAULT = "C:/work";
private static final String[] EXTENSIONS = {".doc", ".docm", ".xls"};
// TODO: the keywords are not used anywhere yet
private static final String[] KEYWORDS = {"Performance Enhancement", "Functional Specification", "Technical Specification", "Faults", "Arval", "Vehicle", "Fines", "Insurance"};
public void start(String rootFolder) {
List<String> files = new ArrayList<>();
readFilesRecursively(new File(rootFolder), files);
// trick to print list contents by converting to array
System.out.println(Arrays.toString(files.toArray()));
}
// recursion is not that common so when you use it,
// it's a good idea to clearly indicate this in the method name
public void readFilesRecursively(File folder, List<String> files) {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
readFilesRecursively(file, files);
} else {
for(String extension : EXTENSIONS) {
String fileName = file.getName();
if (fileName.contains(extension ) && !isTemporaryFile(fileName)) {
files.add(fileName);
}
}
}
}
}
// if you find yourself adding a comment in the middle of your code
// that usually means you need to extract a method for that bit
private boolean isTemporaryFile(String fileName) {
return fileName.startsWith("~$");
}
public static void main(String[] args) throws Exception {
KeywordsRecognition app = new KeywordsRecognition();
app.start(getRootFolder(args));
}
private static String getRootFolder(String[] args) {
if(args != null && args.length > 0) {
return args[0];
}
else {
return ROOT_FOLDER_DEFAULT:
}
}
旁注:你不能增加数组的大小;一旦你创建它,它的大小是固定的。因此要么将数组初始化为正确的长度,要么使用java.util.List(可选择在完全填充后将List转换为数组):
List<String> values = new ArrayList<>();
values.add("1");
values.add("foo");
values.add("elderberries");
String[] valuesAsArray = values.toArray();
要么是,要么:
String[] valuesAsArray = new String[3];
values[0] = "1";
values[1] = "foo";
values[2] = "elderberries";
答案 1 :(得分:0)
main
无法在files
中看到listFilesForFolder
变量的原因是files
是本地变量。它的范围是listFilesForFolder
方法本身。 (如果您将main
和listFilesForFolder
声明为实例方法,则仍然如此。)
有许多可能的解决方案。最直截了当的是:
返回值files
作为listFilesForFolder
的结果,并使用main
中返回的值。
将files
声明为static
变量而不是局部变量。
将files
声明为实例变量,然后将代码更改为面向对象;以阿德里安的答案为例。
在这些方法中,1和3更好。方法2将在这样的简单示例中工作,但在大型应用程序中存在问题(由于各种原因)。