2010-10-26 3 views
2

я следующий код:Назначение нуль для ArrayList элементов в Java

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 не имеют значение null. В следующий раз, когда я вызову work(), m_stmtOne не будет null, но будет закрыт. Я предположил, что могу проверить, открыт ли 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; 
     } 
    } 
} 

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

+0

Код, указанный в вопросе, не может вести себя так, как вы описали. Для начала метод 'init()', как указано, просто заполняет 'alPrepStatements' 100 записями« null ». –

+0

Да, мне пришлось вернуться и прочитать на разных ссылках. Мне нужно, чтобы PreparedStatements были переменными-членами, чтобы проверить, являются ли они нулевыми до их подготовки; Я считаю, что готовить их каждый раз не так эффективно? Я помещал их в список, потому что мне хотелось пройти через список, чтобы закрыть их, вместо того, чтобы вручную закодировать каждый из них и переназначить значение null. Я решил, что самое простое решение - просто скопировать все закрытие и переназначение вручную. – foamboarder

ответ

3

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

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

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

0

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

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 в первую очередь.

0

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

EDIT: Чем больше я смотрю на этот код, тем больше я не понимаю, что он должен делать.

+0

Я просто хочу, чтобы переменные-члены класса были нулевыми, итерациями по списку. – foamboarder

+0

Нет никакого способа сделать это без использования отражения, и это не то, что вы хотите.Понимание вашей проблемы потребует лучшего понимания ссылок на переменные в Java. Ваш код, как показано в вопросе, не имеет большого смысла. Как правило, вы не будете содержать явные ссылки на переменные-члены в дополнение к тому, чтобы удерживать те же самые объекты в списке. Есть ли конкретная причина, по которой вы хотите иметь переменную-член для каждого подготовленного оператора? Почему бы просто не держать их в списке и только в списке? – kaliatech

+0

Я прокомментировал мой оригинальный пост выше ... – foamboarder

Смежные вопросы