У меня есть следующий код:
static ArrayList<PreparedStatement> alPrepStmts = new ArrayList<PreparedStatement>();
static PreparedStatement m_stmtOne;
static PreparedStatement m_stmtTwo;
static PreparedStatement m_stmtThree;
...
static PreparedStatement m_stmtOneHundred;
private static void init() {
alPrepStmts.add(m_stmtOne);
alPrepStmts.add(m_stmtTwo);
alPrepStmts.add(m_stmtThree);
...
alPrepStmts.add(m_stmtOneHundred);
}
private static void work() {
if(m_stmtOne == null) {
// assign m_stmtOne
}
// use m_stmtOne
}
private static void close() throws SQLException {
for(PreparedStatement ps : alPrepStmts) {
if(ps != null) {
ps.close();
ps = null;
}
}
}
init () вызывается один раз. work () и close () могут вызываться несколько раз. Проблема состоит в том, что после вызова close () PreparedStatements не устанавливается в нуль. В следующий раз, когда я вызову work (), m_stmtOne не равно нулю, но закрыто. Я предполагал, что смогу проверить, открыт ли m_stmtOne, но мне интересно, как я могу присвоить значение null членам контейнера.
Я также пытался использовать итераторы, и это тоже не работает. Условие if ниже никогда не выполняется.
private static void ClosePreparedStatements() throws SQLException {
for(Iterator<PreparedStatement> it = alPrepStmts.iterator(); it.hasNext();) {
PreparedStatement ps = (PreparedStatement)it.next();
if(ps != null) {
ps.close();
ps = null;
}
}
}
Я знаю, что могу закрыть и назначить каждый оператор вручную, но мне просто интересно, как лучше назначить null для элементов в контейнере.