我是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;
}
}
你认为我能用对象做得更好吗?如果答案是肯定的,你能给我指导吗?
非常感谢你的帮助。
答案 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。
<强>错误:强>
您将静态字段保密。私人字段只能在课堂内访问(除非是反思:现在不要进入)。因此,将标记为静态不会带来额外的好处。相反,它将是内存中的开销(在这种情况下很小但仍然是)
如果你想要它们是静态的,你应该没有让它们成为不可变的。静态字段是类级别字段,并且不将它们标记为final,您允许类的不同对象修改它们,这可能导致数据损坏。
目前您正在使用在Java中具有单独内存管理机制的Strings。但是如果你在对象引用中使用相同的代码(将对象引用标记为静态),那么你将不必要地长时间保持对象在内存中存活,这将对内存造成巨大压力。