Java中声明静态常量会影响编译后的类

Mar*_*rcx 2 java static constants

好吧,这是我的疑问......

我有一个 blazeDS (tomcat) 应用程序,其中包含一些类,每个类都使用ConfigDB类进行配置和数据库连接...

这是一个例子

Config班级

public class Config {
    public static final String DBClass = "oracle.jdbc.driver.OracleDriver";
    public static final String ConnectString = "jdbc:oracle:thin:@//127.0.0.1:1521/xe";
    public static final String UserDB = "user";
    public static final String PasswordDB = "pass"; 
}
Run Code Online (Sandbox Code Playgroud)

DB班级

public class DB
{       
    public DB() {}

    public static Connection dbConnect(Connection c)
    {
                try
                {      if (c == null || c.isClosed()){                                  
                            Class.forName(Config.DBClass);
                            c = DriverManager.getConnection(Config.ConnectString,Config.UserDB,Config.PasswordDB);
                        }
                return c;                        
                }
                catch (Exception e)
                {
                        System.out.println(e.getMessage());
                        return null;
                }
    }

    public static void closeConnection(Connection connection) throws SQLException
    {
        if (!connection.isClosed())
            connection.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个测试和生产环境,每个数据库访问都有不同的用户/密码。我注意到,当使用测试类更新生产文件时(我不覆盖Config.class),我从数据库收到错误...

那么,static final编译版本中的值(用户/密码)是否直接保存在类本身中(在我的例子中是 DB.class)???

Art*_*tov 5

简而言之,是的。

\n\n

Java 规范摘录:

\n\n
\n

“对常量变量 (\xc2\xa74.12.4) 字段的引用在编译时解析为所表示的常量值。对此类字段的引用不应出现在代码中的二进制文件(包含该字段的类或接口除外,该类或接口将具有对其进行初始化的代码)。此类字段必须始终显示为已初始化 (\xc2\xa712.4.2);默认初始值决不能观察到此类字段类型的值。有关讨论,请参阅 \xc2\xa713.4.9。” (第 339 页)

\n
\n