你认为我滥用静电吗?

时间:2016-03-17 11:36:55

标签: java oop object static-methods

我是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;
    }

}

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

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:4)

应尽可能避免使用可变静态字段。特别是,你所拥有的东西将无法发挥作用,因为它们只会被初始化一次。

// 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)

在课程结束时你有一些实用程序/辅助方法。我会将它们放在另一个类中,因为它们看起来并不相关。即,对这些方法有明确的实用程序类。 e.g。

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()));
    }
}

答案 1 :(得分:0)

让我们快速了解一下你做对与错:

从右:

您将字段保密,并提供了访问该字段的公共方法。 +1。

<强>错误:

  1. 您将静态字段保密。私人字段只能在课堂内访问(除非是反思:现在不要进入)。因此,将标记为静态不会带来额外的好处。相反,它将是内存中的开销(在这种情况下很小但仍然是)

  2. 如果你想要它们是静态的,你应该没有让它们成为不可变的。静态字段是类级别字段,并且不将它们标记为final,您允许类的不同对象修改它们,这可能导致数据损坏。

  3. 目前您正在使用在Java中具有单独内存管理机制的Strings。但是如果你在对象引用中使用相同的代码(将对象引用标记为静态),那么你将不必要地长时间保持对象在内存中存活,这将对内存造成巨大压力。