在可从主Java访问的静态方法内创建数组

时间:2018-01-25 09:48:03

标签: java arrays

这是我尝试在静态方法中创建数组的不良尝试。该程序的作用是列出具有特定扩展名的文档。我希望能够将它们存储在一个数组中并从main访问该数组。可能吗?到目前为止,这是我的代码:

{{1}}

我知道这是一个静态方法,并且int和数组不会被视为非静态方法,但是,我不知道如何继续进行。

2 个答案:

答案 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方法本身。 (如果您将mainlistFilesForFolder声明为实例方法,则仍然如此。)

有许多可能的解决方案。最直截了当的是:

  1. 返回值files作为listFilesForFolder的结果,并使用main中返回的值。

  2. files声明为static变量而不是局部变量。

  3. files声明为实例变量,然后将代码更改为面向对象;以阿德里安的答案为例。

  4. 在这些方法中,1和3更好。方法2将在这样的简单示例中工作,但在大型应用程序中存在问题(由于各种原因)。