1

我正在使用 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() 函数?

4

1 回答 1

1

static关键字意味着该变量m_hadoopFileSystem将由该类的所有实例共享,但是它不会阻止您多次分配该变量。目前,HadoopFileSystem每次实例化对象时都会得到一个新TweetHADOOPDAO对象,覆盖对任何现有HadoopFileSystem对象的引用。

如果您确实需要确保只创建一个实例,请查看使用单例模式

关于你的第二点,不幸的是,我认为没有关闭事件。但是,您可以shutdown()向侦听器添加一个调用TweetHADOOPDAO#close().

然后您可以StatusListenerStore#shutdown()在调用TwitterSteam#shutdown().

于 2013-06-25T08:27:05.213 回答