Присвоение нуля элементам ArrayList в Java - PullRequest
2 голосов
/ 27 октября 2010

У меня есть следующий код:

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 для элементов в контейнере.

Ответы [ 4 ]

3 голосов
/ 27 октября 2010

Ваше присвоение ps = null назначает только локальную переменную, оно не изменяет исходный контейнер. Вы должны использовать remove метод java.util.Iterator (во втором урезанном коде вместо ps = null), чтобы удалить элемент из контейнера. Обратите внимание, что это удаляет элемент из контейнера, а не заменяет его на ноль в контейнере.

Даже если вы удалите элемент из контейнера, он не изменит значение, например, m_stmtOne, что звучит так, как будто вы тоже хотите, чтобы это произошло. Тебе придется сделать это другим способом.

Также кажется, что init() просто добавляет 100 нулей в ваш список подготовленных утверждений. Присвоение ненулевого значения m_stmtOne позже не изменит список. Другими словами, m_stmtOne добавляется в список по значению, а не по ссылке.

0 голосов
/ 27 октября 2010

Оператор for создает переменную локальной области видимости.Вы устанавливаете это значение null, но оно не устанавливает нулевую ссылку на элемент списка или переменную члена класса, как вы, вероятно, поняли.

РЕДАКТИРОВАТЬ: Чем больше я смотрю на этот код, тем больше я не понимаю, что он должен делать.

0 голосов
/ 27 октября 2010
0 голосов
/ 27 октября 2010

Один из способов будет:

for(int i = 0; i < alPrepStmts.size(); i++) {
    if(alPrepStmts.get(i) != null) {
        alPrepStmts.get(i).close()
        alPrepStmts.set(i, null);
    }
}

Кстати, если у вас есть List<PreparedStatement>, вам не нужно приводить каждую запись к PreparedStatement.Это то, для чего в основном используются Java Generics.

...