Как не писать код Java

В статье на Baeldung о пуле соединений Hikari приводится следующий пример кода. Статья полезная, код работает. Также не очень приятно придираться к тому, кто пытается помочь. В частности, потому что такого рода примеры настолько распространены, что мы могли бы выбрать практически любой пример наугад на Baeldung или любом другом сайте кодирования и увидеть похожие проблемы. Однако такая структура кода действительно заслуживает краткого комментария, так как это хороший быстрый пример того, как не нужно писать код на Java.

public class DataSource {

    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
        config.setJdbcUrl( "jdbc_url" );
        config.setUsername( "database_username" );
        config.setPassword( "database_password" );
        config.addDataSourceProperty( "cachePrepStmts" , "true" );
        config.addDataSourceProperty( "prepStmtCacheSize" , "250" );
        config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );
        ds = new HikariDataSource( config );
    }

    private DataSource() {}

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

Лучший способ

В более ранней статье Шесть причин, почему большая часть Java, которую вы видели, не является настоящей Java, мы обсуждали static методы как антишаблон. В приведенном выше коде DataSource.getConnection() является фабричным методом static. Это означает, что мы не можем легко поменять местами пулы соединений.

Одно лишь ключевое слово static должно заставить нас усомниться в имеющемся коде.

Хотя мы, безусловно, можем выполнить работу с помощью приведенного выше кода, вот способ Java сделать точно то же самое:

public interface DatabaseConnector
{
    Connection connect() throws SQLException;
}

public class HikariDatabaseConnector implements DatabaseConnector
{
    private HikariDataSource dataSource;

    public HikariDatabaseConnector(String url, String userName, String password)
    {
        HikariConfig configuration = new HikariConfig();

        configuration.setJdbcUrl(url);
        configuration.setUsername(userName);
        configuration.setPassword(password);
        configuration.addDataSourceProperty("cachePrepStmts", "true");
        configuration.addDataSourceProperty("prepStmtCacheSize", "250");
        configuration.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        dataSource = new HikariDataSource(configuration);
    }

    public Connection connect() throws SQLException
    {
        return dataSource.getConnection();
    }
}

Теперь все static ключевых слов удалены, и в результате у нас есть более понятный и универсальный способ подключения к базам данных, почти без дополнительных усилий.

Также обратите внимание, что название изменилось с DataSource на DatabaseConnector. Это может показаться хорошим моментом, но то, как что-то названо, имеет тенденцию концептуально ограничивать то, как мы об этом думаем. Здесь «коннектор» — гораздо лучшее название, чем «источник данных», потому что оно дает «соединение» (что легко увидеть, если немного подумать). Мы ожидаем, что DataSource предоставит нам какие-то данные, а не соединение. Хотя ничего не стоит, что DataSource это как минимум имя лучше, чем DatabaseConnectionPool. Почему?DatabaseConnectionPool содержит сведения о реализации в названии. В будущем могут появиться другие способы подключения к базе данных, не связанные с пулом соединений (может быть, SecureDatabaseConnector? RetryingDatabaseConnector?). Приведенный выше интерфейс DatabaseConnector указывает четкий и расширяемый способ подключения к базе данных.

Заключение

Размышление об объектно-ориентированных принципах и именовании может сделать код более гибким, легким для чтения и более расширяемым. Хороший вывод из этой статьи — попытаться использовать Java так, как если бы ключевого слова static не существовало. Иногда это необходимо, но в большинстве случаев это не так, и часто это просто делает код еще одним примером того, как не нужно кодировать на Java.

Статьи по Теме

Шесть причин, почему большая часть Java, которую вы видели, не является настоящей Java
Почему хост — это не строка, а порт — не целое число
Целое число — это не число
Все разделяй и властвуй