我是Java编程的新手,我想我很清楚这些对象是什么以及如何使用它们。

但是,由于我正在编写程序,所以我注意到我对方法使用了很多“静态”关键字,并且我怀疑这是否是因为它确实是必要的和合乎逻辑的,还是因为我没有在我看来,OO概念是内部化的。

更具体地说,我的程序应从txt文件读取并将每一行放入ArrayList中,这是我的代码:

public class FileBody {

    private static final String SEPARATOR = ";";
    private static String headerField1 = "regex";
    private static String headerField2 = "origin";
    private static String headerField3 = "destination";
    private static final String HEADER = headerField1 + SEPARATOR + headerField2
            + SEPARATOR + headerField3 + SEPARATOR;

    // Getters & setters

    public static String getHeader() {
        return HEADER;
    }

    public static String getHeaderField1() {
        return headerField1;
    }

    public static void setHeaderField1(String headerField1) {
        FileBody.headerField1 = headerField1;
    }

    public static String getHeaderField2() {
        return headerField2;
    }

    public static void setHeaderField2(String headerField2) {
        FileBody.headerField2 = headerField2;
    }

    public static String getHeaderField3() {
        return headerField3;
    }

    public static void setHeaderField3(String headerField3) {
        FileBody.headerField3 = headerField3;
    }

    // End getters & setters

    public static File createFileIfNotExists(String path) throws IOException {
        File file = new File(path);
        if (file.createNewFile());
        return file;
    }

    public static File getFile(String path) throws IOException {
        File file = createFileIfNotExists(path);
        return file;
    }

    public static boolean isEmpty(File file) throws Exception {
        FileReader fileReader = new FileReader(file);
        if (fileReader.read() != -1) {
            fileReader.close();
            return false;
        } else {
            fileReader.close();
            return true;
        }
    }

    public static void writeHeaderToEmptyFile(File file) throws Exception {
        if (isEmpty(file)) {
            BufferedWriter bufferedWriter = new BufferedWriter(
                    new FileWriter(file, false));
            bufferedWriter.write(HEADER);
            bufferedWriter.close();
        } else {
            return;
        }
    }

    public static ArrayList<String> getLines(File file) throws Exception {
        ArrayList<String> lines = new ArrayList<>();
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        while (bufferedReader.ready()) {
            lines.add(bufferedReader.readLine());
        }
        bufferedReader.close();
        return lines;
    }

}


您认为我可以用对象做得更好吗?如果答案是肯定的,您能给我指导方针吗?

非常感谢您的帮助。

最佳答案

应尽可能避免具有可变的静态字段。特别是,您只能使用一次,因此无法使用。

// only run once even if these fields are changed.
private static final String HEADER = headerField1 + SEPARATOR + headerField2
        + SEPARATOR + headerField3 + SEPARATOR;


您最想要的是

public static String getHeader() {
    return headerField1 + SEPARATOR + headerField2
        + SEPARATOR + headerField3 + SEPARATOR;
}


应为static的唯一字段是SEPARATOR,因为这是一个常量。我会尝试将所有其他字段都设置为非静态字段(以及它们的getter / setter)

在课程的最后,您有一些实用程序/帮助程序方法。我将它们放在另一个类中,因为它们似乎无关。也就是说,请为这些方法使用明确的实用工具类。例如

class FileBody {
    public void writeHeaderToEmptyFile(File file) throws IOException {
        if (!FileUtils.isEmpty(file)) return
        try (Writer w = new FileWriter(file)) {
            w.write(getHeader());
        }
    }
}

class enum FileUtils {
    /* no instances */ ;

    // TODO replace all callers with new File(x);
    public static File getFile(String filename) {
         return new File(filename);
    }

    public static boolean isEmpty(File file) {
        return file.length() > 0;
    }

    public static List<String> getLines(File file) throws Exception {
        return Files.readAllLines(Paths.get(file.getAbsolutePath()));
    }
}

08-29 01:20