在Java中声明静态常量将影响已编译的类

时间:2012-07-31 09:02:06

标签: java static constants

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

我有一个带有一些类的blazeDS(tomcat)应用程序,每个Class使用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"; 
}

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();
    }
}

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

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

3 个答案:

答案 0 :(得分:4)

简而言之,是的。

摘自Java specs

  

“参考   对于作为常量变量的字段(第4.12.4节),解析为   编译时到表示的常量值。没有参考   这样的字段应该存在于二进制文件的代码中(除了   包含该字段的类或接口,它将具有代码   初始化它)。这样的领域似乎总是如此   初始化(§12.4.2);此类型的默认初始值   绝不能观察到一个场。有关讨论,请参见§13.4.9。“(p。   339)

答案 1 :(得分:0)

  

那么,是否保存了编译版本中的静态最终值(user / pass)   直接在类本身(在我的例子中DB.class)???

是的,任何最终变量都会被字节码中的文字值替换。

答案 2 :(得分:0)

静态最终变量(常量)是“编译时间常量”,它们的目的地是内联的。

所以如果你在几个类中使用常量,那么这些类会受到影响。如果由于某种原因没有部署所有受影响的类,则会发生坏事,并且仍然使用旧值。