我最近一直在考虑以下设计考虑因素:假设我有一个能够读取文件并返回一些结果的对象。你会说这个对象应该公开一个接口:
void readFromFile(File file);
或者你会设计它有一个方法
void readFromFile();
并在构造函数中提供必要的值?如果我们想要为构造函数提供多个参数并使用构建器根据某些用户首选项构建fileReaders,那么第二个选项似乎没问题......你怎么看?
答案 0 :(得分:7)
这取决于对象的更广泛的背景。
如果您的对象具有高度内聚性,即它的目的范围很窄,主要是从特定文件中读取,那么它应该在构造函数中定义。在OO设计方面,高凝聚力通常是一件好事 - 所以我通常喜欢这个选项。如果您的应用程序是多线程的,因此您的对象需要是线程安全的,那么我肯定会倾向于这一点 - 我认为这种方法可以更容易地构建粒度,不可变对象,这在尝试避免时非常有用种族危害。
如果您的对象负责许多其他任务,您实际上并不需要担心并发性,并且将文件作为实际对象的状态的一部分包含在内是没有意义的,那么拿参数的方法可以说是最好的选择。
答案 1 :(得分:2)
我认为这是关于你的对象代表什么的问题。
如果没有文件,你应该想知道你的对象模型的实例是否有任何意义。
考虑你的对象的责任,使用“把对象带到沙漠”的方法:尝试思考你的对象是什么,以及它应该知道什么。就在这时,你会得到答案。
答案 2 :(得分:1)
第一种解决方案是最干净的。
但是,在处理多线程时会有很大的不同。
两种情况:
您的课程应该被实例化一次:
如果您的对象不是不可变的并且将file
对象作为字段,则必须进行大量同步(锁定)以避免意外。
您的课程应该被实例化N次
N个线程的N次=>可能需要大量内存,具体取决于您的要求和实例的权重。
因此,API void readFromFile(File file);
更合适,因为file
对每个帖子都是本地的。
实际上,如果您的类拥有许多操作file
对象的方法,并且并发和内存空间不是主要优先级,请将file
作为实例的字段。这会清理您的代码。
答案 3 :(得分:0)
这实际上取决于该对象的使用位置 - 如果这是一个只读取一个或两个文件的程序,并且它们被多次读取,那么第二个选项会更好;在几乎所有其他场景中,第一种情况会占上风,因为您可以使用单个对象来读取大量文件。
然后,再次,如果你计划在许多程序中使用这个类(或者甚至分发它),因此不确定哪种方法事先是最好的,那么没有理由你不能同时包括两个 - 有两个构造函数(一个默认值,一个带文件),然后包括上面列出的两种方法 - 这样就可以在任何一种类型的程序中有效地使用该类。
即
public class YourFileReader() {
File defaultFile;
public YourFileReader() {
//initialize
}
public YourFileReader(File aDefault) {
defaultFile = aDefault;
//initialize
}
public void readFromFile() {
if(defaultFile!=null) {
//read from defaultFile
}
else {
//exception?
}
}
public void readFromFile(File file) {
//read from file
}
}