我正在使用twitter4j开发一个应用程序。我使用DAO将推文存储在一个文件中。
我实现了StatusListener
类:
public class StatusListenerStore implements StatusListener {
// DAO
private DAO<Status> m_statusDAO;
// Constructor
public StatusListenerStore(FactoryType a_factoryType,ArrayList<String> a_lanTrackList) {
super();
AbstractDAOFactory l_DAOFactory = AbstractDAOFactory.getFactory(a_factoryType);
m_statusDAO = l_DAOFactory.getTweetDAO();
}
}
呼叫的DAO是:
// Extract of my class
private static HadoopFileSystem m_hadoopFileSystem = null;
public TweetHADOOPDAO(){
m_hadoopFileSystem = new HadoopFileSystem(m_path+m_filename);
}
public void close(){
m_hadoopFileSystem.closeWriters();
}
HadoopFileSystem包含OutputStream
我必须关闭。
首先,我只想为我的所有程序提供一个HadoopFileSystem对象实例。 static关键字保证我吗?
接下来,要关闭我的输出流,我必须在流完成后调用DAO类中的close函数。我使用正确的shutdown()
函数关闭它。
但m_statusDAO
对象是在我的StatusListener类中声明的。当流关闭时,如何在此类中调用close()函数?
答案 0 :(得分:1)
static
关键字表示m_hadoopFileSystem
变量将由该类的所有实例共享,但不会阻止您多次分配变量。目前,每次实例化HadoopFileSystem
对象时,您将获得一个新的TweetHADOOPDAO
,覆盖对任何现有HadoopFileSystem
对象的引用。
如果您确实需要确保只创建一个实例,请查看using the singleton pattern。
关于你的第二点,不幸的是我认为没有关闭事件。但是,您可以向侦听器添加shutdown()
方法,该方法会调用TweetHADOOPDAO#close()
。
然后,您可以在调用StatusListenerStore#shutdown()
后再拨打TwitterSteam#shutdown()
。