Как объявить глобальный статический класс в Java? - PullRequest
3 голосов
/ 10 февраля 2010

В 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 ]

9 голосов
/ 10 февраля 2010

По сути, так же, просто создайте (нормальный) класс final с закрытым конструктором (исключает возможность new) и добавьте только статические члены.

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

    public static bool getConnection() {
    }

    private clsDBUtils() {}
}
5 голосов
/ 10 февраля 2010

Помимо конкретного вопроса / проблемы, плохая практика объявляет дорогие и внешние ресурсы, такие как Connection, Statement и ResultSet, как переменную экземпляра, не говоря уже о static переменная. Эти ресурсы не имеют бесконечного срока службы, и ваше приложение может перестать работать, когда БД решит прервать соединение, поскольку оно не было возвращено в БД после использования.

Я не могу себе представить, что это делается по-другому в C # (это также было бы ошибкой в ​​приложении), но обычная идиома JDBC заключается в том, что вы получаете и закрываете его в кратчайшем объеме, таким образом, уже внутри тот же метод блока. Э.Г.

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 после использования!)

Однако это делает источник соединения действительно статическим . Вы не можете больше пользоваться преимуществами полиморфизма и / или наследования для переключения между источниками соединений, такими как пул соединений (для повышения производительности). Чтобы получить больше идей / идей, вы можете найти эту статью полезной

1 голос
/ 10 февраля 2010

Код для него почти такой же (та же концепция, немного другой синтаксис)

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

    public static boolean getConnection()
    {
    }
}

// somewhere else
ClsDBUtils.getConnection();
0 голосов
/ 10 февраля 2010

Вы хотите реализовать шаблон 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();
0 голосов
/ 10 февраля 2010

Просто объявите открытый класс и используйте модификатор static в ваших методах и полях. Если вы не хотите, чтобы он создавался, используйте 'public final class'. Кроме того, вы можете использовать одноэлементный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...