[英]Making a static field final in Java
查看以下代碼片段,給出的方案是從Tomcat服務器中的數據庫連接池獲取數據庫連接。
public final class DatabaseConnection {
private static DataSource dataSource;
static {
try {
Context initContext = new InitialContext();
Context context = (Context) initContext.lookup("java:comp/env");
dataSource = (DataSource) context.lookup("jdbc/assignment_db");
} catch (NamingException e) {
Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, e);
}
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
我想成為班級final
唯一的一個領域。 如果我把它作為final
字段,那么編譯器會抱怨,
變量dataSource可能尚未初始化。
在final
完成后,如果在聲明位置將其初始化為null
,則嚴禁禁止在try
塊中進一步初始化此字段,從而導致編譯錯誤,
無法為最終變量dataSource分配值。
NamingException
是一個經過檢查的異常。 因此,它必須被捕獲或聲明被拋出。
早些時候,情況有所不同。 策略是使用Apache DBCP如下。
public final class DatabaseConnection {
private static final BasicDataSource basicDataSource;
static {
basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUrl("jdbc:mysql://localhost:3306/assignment_db");
basicDataSource.setUsername("Tiny");
basicDataSource.setPassword("root");
}
public static Connection getConnection() throws SQLException {
return basicDataSource.getConnection();
}
}
其中,該字段可以被聲明為final
因為沒有檢查異常並且try...catch
是不必要的。
在第一種情況下,我能以某種方式使dataSource
最終的嗎?
這讓我陷入了很多次,直到找到了解決方法。 您可以在static
塊中使用臨時變量,並在try-catch
結束后使用該變量分配dataSource
:
private static final DataSource dataSource;
static
{
DataSource tempDataSource = null;
try
{
Context initContext = new InitialContext();
Context context = (Context) initContext.lookup("java:comp/env");
tempDataSource = (DataSource) context.lookup("jdbc/assignment_db");
} catch (NamingException ex) {
Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
}
dataSource = tempDataSource;
}
但是,我不想正常關注,只有在未初始化dataSource
時才從catch
塊中拋出異常,在這種情況下,您不需要局部變量:
static
{
try
{
Context initContext = new InitialContext();
Context context = (Context) initContext.lookup("java:comp/env");
dataSource = (DataSource) context.lookup("jdbc/assignment_db");
} catch (NamingException ex) {
Logger.getLogger(DatabaseConnection.class.getName()).log(Level.SEVERE, null, ex);
throw new ExceptionInInitializerError("dataSource not initialized");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.