我有一个在构造函数中打开文件的类,在调用方法时写入文件。我应该在哪里关闭文件? 该类实现了一个只有一个方法的通用接口,我不会添加公共方法。
library(data.table)
rbindlist(mget(paste0("data", 1:7))
我不允许添加公共方法endChanges()。
此类也无法知道更改何时结束。
我被允许改变构造函数和makeChange()的工作方式。
我尝试了finalize(),但它甚至没有运行。
EDIT。 接口I由许多类实现。 其中一些不需要文件,因此它们不需要closeFile()方法。
目标是为所有实现运行相同的代码:
public interface I {
void makeChange();
}
public class C implements I {
FileWriter f;
PrintWriter p;
public C() {
f = new FileWriter("log.txt");
p = new PrintWriter(p);
}
@Override
public void makeChange() {
p.println("something");
p.flush();
}
}
答案 0 :(得分:1)
阻止您添加公共方法endChanges()
的设计本质上是错误的,并且阻止您以正确的方式执行此操作。
如果这是某种家庭作业或测验(或更糟糕的是,测验 - 家庭作业),"正确"答案可能是使用finalize()
。但正如您已经注意到的那样,此方法甚至可能无法运行(例如,如果JVM在需要释放对象之前停止)。在这种简单的情况下,它可以,因为它会同时关闭文件,但通常不会因为您遇到的原因而使用finalize()
。
正确的方法是让类实现Closeable
接口并为用户提供close()
方法,以便在完成时调用。由于您希望在打开和关闭文件之间调用文件上的多个调用,因此这是标准方法。
(编辑添加):如果你有多个实现,其中一些需要任何清理逻辑,而另一些则不需要,那么接口完全可以使用用户必须调用的清理(关闭)方法但是实现留空。
如果您需要绝对确定用户不会忘记关闭文件,您可以创建一个doWithFile()
方法,该方法接受对文件执行的回调,打开文件,执行回调然后关闭文件。