2016-12-03 55 views
2

我有一个类需要使用我在类构造函数中存储在.txt文件中的一些信息。然而,我并不是真的想让构造函数每次创建类的新实例时就读入并解析文件,因为这是浪费时间/内存。如何避免每次创建新实例时从文件中读取数据

我该如何读取数据并以某种方式将其存储到构造函数中?在创建类的新实例并将数据传递给构造函数之前,我可以读取该文件,但这看起来像是一个不雅的解决方案。

具体来说:我有一个Email类(本质上是围绕List<String>包装)。但是,我想从电子邮件的文本中删除所有出现的一组停用词(它们在单独的.txt文件中列出)。我怎样才能避免每次创建Email的新实例时必须读取这组停止词?

+1

你为什么不通过书面文件中的类的构造函数的信息? –

+1

正如我在我的问题中提到的那样,我已经考虑过这个问题(事实上这是我目前的工作方式),但在我看来可能有更好的方法(因为这种方法涉及将完全相同的信息传递给每次创建一个新实例时,构造函数)。如果没有,那么我会坚持我正在做的,但我对Java很新,所以我认为可能有一些我错过了。 – rtb123

+0

我明白了你的观点。你需要的是在你的'Email'类中有静态成员变量。我已经更新了我的答案,你可以在那里看到解释。 –

回答

0

加载停用词表并将其存储在数据结构中(例如,ArrayList),并将其作为参数传递给Email类的构造函数。您可以编写一个函数来读取文件,并且您可以调用它一次将其加载到数据结构中,并在您每次创建该类的实例时将其传递给Email类构造函数。

当您创建新实例时,您还可以创建一个类来读取该文件并将该类的对象传递给Email类。

更新

看到您的评论后,我想你需要的是在你的类Static成员变量/方法。

说明:非静态变量是类实例的成员;每个实例都有自己的副本。静态变量是类本身的成员;他们不受限于任何特定的情况。同样,非静态方法对类的实例进行操作,静态方法不与特定实例绑定。

所以,我相信你想可以通过在Email类中添加方法的static成员取得的成就。

0

创建一个类来读取文件。创建该类的单个实例,并将该引用传递给将使用该信息的类的构造函数。

0

听起来像抽象工厂模式可能对你有用。您可以创建一个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

+1

我在试图找到我的问题的答案时碰到过这种情况,我认为这可能是大多数情况下最好的方法,但我觉得这对我所需要的东西有点矫枉过正。不过谢谢! – rtb123

+0

工厂在您第一次看到它们时可能看起来很吓人,但是当您想要控制应用程序中的依赖关系时,它们非常方便。当你想创建对象的多个实例而不传入大量不一定在你想创建对象的地方可用的构造数据时非常有用。我认为你的问题是使用工厂模式的一个很好的选择 – Einar

相关问题