2013-12-05 4 views
2

Если у меня есть статическое поле, которое я хочу инициализировать, инициализирует его в конструкторе, чтобы оно было назначено каждый раз, когда создается экземпляр нового экземпляра класса?Инициализация статических полей в конструкторе

private static Connection connection; 

    public Database() { 
    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD); 

    } catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

Я мог бы сделать это:

private static Connection connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD); 

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

+2

'но это вызвало проблемы.' ??? – SLaks

+0

Просто не используйте 'static' members/initializers. Делайте все с объектами. –

+0

Нет, я просто думаю об эффективности. Я не хочу создавать экземпляр нового объекта подключения и назначать его для каждого экземпляра. –

ответ

3

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

Да; код в конструкторе будет выполняться всякий раз, когда вы создадите объект.

Вам необходимо использовать статический блок инициализатора.

1

Статические поля относятся к классу, а не к любому экземпляру этого класса. Таким образом, инициализация его в конструкторе не имеет никакого смысла. Поскольку для каждого создания экземпляра это будет повторно инициализировано. Это может вызвать проблемы для вас. Используйте статический инициализатор для инициализации и инициализатор времени загрузки классов для статических полей.

0

Вы должны использовать статический конструктор для инициализации статических переменных, для которых требуется больше инициализации, чем просто простое назначение. Конечно, вы можете использовать только статические переменные в статическом конструкторе. Для примера:

class Database { 
    private static Connection connection; 

    static { 
     try { 
      connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD); 
     } catch (...) {} 
    } 

    ... 
} 

В этом примере, HOST, имя пользователя и пароль должны быть статическими переменными тоже (в этом классе или где-то еще нормально). Однако я сомневаюсь, что вы действительно хотите инициализировать свою базу данных.

0

Да, это то, как работают статические поля. Они разделяются во всех экземплярах вашего класса; в любое время, когда вы вызываете new Database(), он сбросит соединение.

Для баз данных вы должны использовать пул соединений вместо единого общего доступа.

То, что вы хотите, это статический инициализатор:

static { 
    try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      connection = DriverManager.getConnection(HOST, USERNAME, PASSWORD); 

     } catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Этот блок выполняет в первый раз, когда Вы касаетесь статическое поле (которое будет, когда вы создаете новый Database экземпляр).

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