簡體   English   中英

在Java中創建一個靜態字段final

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM