如何避免每次创建新实例时从文件中读取数据
我有一个类需要使用我在类构造函数中存储在.txt
文件中的一些信息。然而,我并不是真的想让构造函数每次创建类的新实例时就读入并解析文件,因为这是浪费时间/内存。如何避免每次创建新实例时从文件中读取数据
我该如何读取数据并以某种方式将其存储到构造函数中?在创建类的新实例并将数据传递给构造函数之前,我可以读取该文件,但这看起来像是一个不雅的解决方案。
具体来说:我有一个Email
类(本质上是围绕List<String>
包装)。但是,我想从电子邮件的文本中删除所有出现的一组停用词(它们在单独的.txt
文件中列出)。我怎样才能避免每次创建Email
的新实例时必须读取这组停止词?
加载停用词表并将其存储在数据结构中(例如,ArrayList),并将其作为参数传递给Email
类的构造函数。您可以编写一个函数来读取文件,并且您可以调用它一次将其加载到数据结构中,并在您每次创建该类的实例时将其传递给Email
类构造函数。
当您创建新实例时,您还可以创建一个类来读取该文件并将该类的对象传递给Email
类。
更新
看到您的评论后,我想你需要的是在你的类Static
成员变量/方法。
说明:非静态变量是类实例的成员;每个实例都有自己的副本。静态变量是类本身的成员;他们不受限于任何特定的情况。同样,非静态方法对类的实例进行操作,静态方法不与特定实例绑定。
所以,我相信你想可以通过在Email
类中添加方法的static
成员取得的成就。
创建一个类来读取文件。创建该类的单个实例,并将该引用传递给将使用该信息的类的构造函数。
听起来像抽象工厂模式可能对你有用。您可以创建一个EmailFactory类,它接受构造函数中的文本文件并存储它。每次在工厂中调用create()方法时,都会创建一个新的Email类,而不会加载文件,也不会将该文件作为参数传递。关于使用工厂而不是静态字段的一个好处是您的类变得更容易测试。 这里是当你使用它,它会怎样看:
EmailFactory emailFactory = new EmailFactory(file);
Email email = emailFactory.create(<whatever you need to pass in>);
Email email2 = emailFactory.create(<whatever you need to pass in>);
工厂可能是这个样子
public final class EmailFactory {
private Set<String> stopWords;
public EmailFactory(File file) {
//read stop words from file here and assign it to stopWords field
}
public Email create(<pass in what you need>) {
//filter from stopWords here
//Create new email object here
return email;
}
}
如果你不喜欢工厂做的读取文件的工作,您可以传递停用词的完成列表。
你可以阅读更多关于抽象工厂模式的方法在这里: https://en.wikipedia.org/wiki/Abstract_factory_pattern
你为什么不通过书面文件中的类的构造函数的信息? –
正如我在我的问题中提到的那样,我已经考虑过这个问题(事实上这是我目前的工作方式),但在我看来可能有更好的方法(因为这种方法涉及将完全相同的信息传递给每次创建一个新实例时,构造函数)。如果没有,那么我会坚持我正在做的,但我对Java很新,所以我认为可能有一些我错过了。 – rtb123
我明白了你的观点。你需要的是在你的'Email'类中有静态成员变量。我已经更新了我的答案,你可以在那里看到解释。 –