如何在Java中声明全局静态类?

时间:2010-02-10 13:50:19

标签: c# java

在C#中,我可以创建一个这样的类:

static class clsDBUtils
{
        public static SQLiteCommand cmd;
        public static SQLiteConnection conn;
        public static String databaseFilePath;

        public static bool getConnection()
        {
        }
}

然后我的命名空间中的任何地方都可以在没有初始化的情况下使用:

clsDBUtils.getConnection();

如何为Java重写?

我不想使用:

clsDBUtils sqlutil= new clsDBUtils();

5 个答案:

答案 0 :(得分:9)

基本上以同样的方式,只需使用私有构造函数创建一个(普通)final类(阻止能够执行new)并仅添加静态成员。

public final class clsDBUtils {
    public static SQLiteCommand cmd;
    public static SQLiteConnection conn;
    public static String databaseFilePath;

    public static bool getConnection() {
    }

    private clsDBUtils() {}
}

答案 1 :(得分:5)

除了特定问题/问题之外,将ConnectionStatementResultSet等昂贵的外部资源声明为实例变量是不良做法 ,更不用说作为static变量了。这些资源没有无限的生命周期,当DB决定超时连接时你的应用程序可能会中断,因为它在使用后还没有被释放回数据库。

我无法想象它在C#中的表现方式不同(它本来也是应用程序中的一个错误),但正常的JDBC习惯用法是你在尽可能短的范围内获取并关闭它,因此已经在非常相同的方法块。 E.g。

public Entity find(Long id) throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    Entity entity = null;

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement(SQL_FIND);
        statement.setLong(1, id);
        resultSet = statement.executeQuery();

        if (resultSet.next()) {
            entity = new Entity();
            entity.setProperty(resultSet.getObject("columnname"));
            // etc..
        }
    } finally {
        // Always free resources in reversed order.
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return entity;
}

database.getConnection()在技术上可以完美地保持静态:

public final class Database {
    static {
        try {
            Class.forName("com.example.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    private Database() {
        // No need to instantiate this class.
    }

    public static Connection getConnection() {
        DriverManager.getConnection("jdbc:example://localhost/dbname", "user", "pass");
    }
}

以便您可以将其用作

connection = Database.getConnection();

(使用后你仍然需要在finally块中关闭!)

然而,这使得连接源也非常静态。您不能再利用多态性和/或继承来在连接源之间切换,例如连接池(以获得更好的性能)。要获得更多想法/见解,您可能会发现this article有用

答案 2 :(得分:1)

它的代码几乎完全相同(相同的概念,略有不同的语法)

public class ClsDBUtils
{
    public static SQLiteCommand cmd;
    public static SQLiteConnection conn;
    public static String databaseFilePath;

    public static boolean getConnection()
    {
    }
}

// somewhere else
ClsDBUtils.getConnection();

答案 3 :(得分:0)

只需声明一个公共类,并在方法和字段中使用'static'修饰符。如果您不希望它被实例化,请使用“public final class”。或者,您可以使用单例类。

答案 4 :(得分:0)

您想要实现Singleton模式:http://en.wikipedia.org/wiki/Singleton_pattern

public class clsDBUtils {
   private static final clsDBUtils INSTANCE = new clsDBUtils();

   // Private constructor prevents instantiation from other classes
   private clsDBUtils() {}

   public static clsDBUtils getInstance() {
      return INSTANCE;
   }

   public SQLiteCommand cmd;
   public SQLiteConnection conn;
   public String databaseFilePath;

   public bool getConnection()
   {
   }
 }

然后,您可以在课程中使用以下语法:

clsDBUtils.getInstance().getConnection();