Рубрики
Без рубрики

Java Preferences API – Это небольшая вещь, которая является Огромным преимуществом

Настройки Java – это беспроблемный подход к большинству потребностей в настройке; вы просто еще этого не знаете. Помеченный java.

Настройки Java Обрабатывают Большую часть того, что Вы хотите сделать

Сильное заявление, но это правда. Мы все сталкивались с различными способами управления конфигурационными данными. Java Preferences API – это одна из тех мелочей в JDK, которые часто упускаются из виду, но очень полезны. Он выполняет большую часть “тяжелой работы” по управлению внешними данными и сокращает объем кода вашего кода.

Куда мне поместить Данные конфигурации?

Я активно разрабатываю Java с 2002 года и до сих пор спрашиваю: “Куда мне поместить данные конфигурации?”. Обычно ответ звучит так: “Везде, где ваши пользователи хотят, чтобы это было пустышкой!”. Однако есть так много вариантов. Какой из них ты хочешь?

Обычный Текстовый Файл

Простой старый файл Java Properties был моим основным выбором для настройки в течение многих лет (и он тоже должен быть вашим). К ним так легко получить доступ и понять. Но куда вы помещаете файл и как ваш код его считывает? Вы помещаете его в classpath? Вы помещаете его во внешний каталог? Меняете ли вы код так, чтобы приложение просто “знало”, где искать? Добавляете ли вы поддержку причудливых имен в стиле Url для вашего файла?

Эти вопросы вызывают разочарование у многих разработчиков и клиентов. Было бы лучше, если бы Java, по крайней мере, дала нам значение по умолчанию, которое можно было бы использовать, как это делается для конфигурации ведения журнала JDK, где файл конфигурации может быть сохранен, а затем переопределен системным свойством.

Еще один вопрос, который я часто задавал, заключается в том, как часто пользователь на самом деле меняет свою конфигурацию? Мой опыт говорит, что ответ приходит очень редко, если вообще когда-либо. Таким образом, в то время как файл конфигурации легко доступен и может быть изменен, эта простота доступа становится спорной, если он не будет часто меняться (подумайте ЯГНИК ).

Другие форматы файлов и библиотеки

Иногда вы думаете, что вам нужен формат, отличный от Properties, поэтому вы пробуете что-то другое, например XML, JSON, YAML или что-то еще (например, ужасный HCL ). Все это хорошо и хорошо, и есть веские “причины” (обоснования) для выбора другого формата файла. Однако то, что вы делаете, увеличивает |/когнитивную нагрузку вашего пользователя . Специальный формат файла конфигурации вообще ничего не добавляет к вашему приложению. И если ваш клиент не будет сильно менять свою конфигурацию после того, как она заработает, какой в этом смысл (см. Выше)?

Но давайте предположим, что вы все равно решили использовать другой формат файла. Теперь вам нужен код для его обработки. Ты мог бы это написать. Это было бы прекрасно. Или так и будет? Кодируйте, отлаживайте, тестируйте, повторяйте, пока дефекты не исчезнут. Это пустая трата времени, которая ничего не добавляет к функциональности вашего приложения.

Хорошо, скажете вы, я последую совету Джоша Блоха по эффективной Java и просто использую стабильную библиотеку это широко используется потому что ошибки были удалены всеми. Использование библиотеки – отличный совет . За исключением того, что теперь вы добавили зависимость в свое приложение. Если ваш график зависимостей уже сложен, это только усугубит ситуацию. Существует множество библиотек на выбор для настройки синтаксического анализа. Да, и не забудьте написать свои тесты для вашей конфигурации. Когда дело доходит до настройки, вашему пользователю может быть все равно, работает ли приложение неправильно.

Как насчет в базе данных или LDAP?

Не. Теперь вы добавили в свое приложение еще одну точку интеграции/зависимость.

Чувак, Ты какой-то Придурок!

Все это косноязычие прочно вошло в дискуссию. У каждого есть причины делать то, что он делает. Мы все знаем, что конфигурация должна улучшать ваше приложение или службу, а не быть в центре внимания. И есть простой способ сделать это для приложений на базе Java. И этот способ заключается в использовании API Preferences это уже часть JDK (и существует с версии 1.4), которая является решением этих распространенных проблем.

Итак, каковы предпочтения Java?

Предпочтения Java – это данные, которые хранятся специфичным для платформы способом и доступны независимо от платформы способом, который используется для хранения конфигураций, которые редко меняются. Сбит с толку? Давайте разберем это по полочкам.

Данные о предпочтениях хранятся наилучшим/общим способом для платформы, на которой в данный момент работает JVM. Например, ваша JVM знает, что она работает в Windows таким образом, конкретная реализация PreferencesFactory будет использовать Реестр Windows для хранения своих данных. Другие платформы будут использовать то, что им подходит. Все в порядке, потому что API в JDK, который используется для доступа к данным предпочтений, одинаков независимо от того, на какой платформе вы работаете, и это позволяет Java самостоятельно решать от выпуска к выпуску, как лучше хранить эти данные. Детали были (очень уместно) абстрагированы от вас, чтобы вы могли сосредоточиться на чтении/записи данных, необходимых для работы вашего приложения.

Итак, теперь, когда вам не нужно беспокоиться о доступе к резервному хранилищу вашей платформы, как мне его изменить? Что ж, поскольку данные хранятся способом, зависящим от платформы, это может означать, что вы не сможете легко получить к ним доступ без инструментов, специфичных для операционной системы. Большую часть времени это нормально, верно? Я имею в виду, если вы постоянно настраиваете свое приложение, то это одно но если вы просто заботитесь о том, чтобы все было настроено и работало, не беспокоясь о том, чтобы что-то менять от запуска к запуску, то это подходит лучше всего. Например, чтобы прочитать или изменить данные настроек в Windows, вы, скорее всего, воспользуетесь Regedit и перейдете к ключу, который хотите изменить. Вместо того, чтобы делать это через, этот API достаточно прост в использовании и понимании, что вы можете написать свои собственные инструменты для выполнения работы за вас используя API и позволяя вашей JRE беспокоиться о деталях редактирования.

Самое приятное в использовании и редактировании настроек таким образом заключается в том, что существует стандартный формат для обмена данными настроек от платформы к платформе. Это полностью доступно для редактирования вне хранилища резервных копий и может быть относительно легко импортировано в другое хранилище резервных копий.

Это Просто пары Ключ-Значение или Что?

Предпочтения – это деревья. У дерева есть корни со многими узлами. Корни предназначены для определения области дочерних узлов (либо для текущего пользователя , либо для всей системы ). Узлы – это имена под корнем. Каждый узел может иметь другой узел или карту в качестве дочерних элементов. Наконец, карта имеет дочерние записи, которые являются парами данных ключ-значение.

Соглашение для узлов заключается в том, чтобы называть их аналогично путям в стиле unix, называя их полным именем класса (включая пакет). Например, под user root может быть узел с именем com/github/argherna/Local Directory Server , где каждая часть “имени пути” является узлом под узлом. На узле самого низкого уровня может находиться карта, содержащая ключи и значения. API настроек позволяет вам читать их как Строки , логические значения , целые числа , байтовые массивы и другие типы данных, и для этого требуется установить значение по умолчанию, если пары ключ-значение нет в карте (настройки не любят нулевые значения).

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

Покажите мне пример этого “Независимого от платформы” API

Когда вы сравниваете файлы свойств чтения и записи с настройками чтения и записи, вы замечаете, что вещи, о которых вы раньше беспокоились, просто исчезают.

Чтение предпочтений

Шаги, которые вы должны выполнить, чтобы получить доступ к предпочтению, следующие:

  1. Получите root (либо user , либо system ).
  2. Получите узел под своим корнем.
  3. Прочитайте пару ключ-значение под узлом.

Если пара ключ-значение не находится под узлом, она будет создана в резервном хранилище.

Preferences myConnectionPrefs = Preferences.userRoot().node("com/github/argherna/MyApplication/connections");
String url = myConnectionPrefs.get("url", "http://example.com");

// Now start doing stuff with the url.

Сохранение предпочтений

Аналогично описанным выше шагам, которые вы должны выполнить, чтобы сохранить настройки, являются:

  1. Получите root (либо user , либо system ).
  2. Получите узел под своим корнем.
  3. Сохраните пару ключ-значение под узлом.

Эта часть API настроек представляет для меня небольшую дырявую абстракцию . Методы, используемые для сохранения данных, начинаются с глагола put , который связан с интерфейсом Map . Возможно, это было сделано намеренно. Если бы это было так, я мог бы получить структуру данных карты под узлом и работать непосредственно с ней, затем установить ее обратно на узел и позволить API сохранить настройки.

String newUrl = "https://secure.example.com/";
Preferences myConnectionPrefs = Preferences.userRoot().node("com/github/argherna/MyApplication/connections");

// Save the newUrl.
myConnectionPrefs.put("url", newUrl);

Другие Операции

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

Что еще это может сделать?

Самое замечательное в API настроек заключается в том, что он является расширяемым. Смотрите Preferences API . Это означает, что если ваш ИТ-магазин централизует свои настройки, помещая их в базу данных или LDAP (как я ворчал ранее), вы можете написать свой собственный PreferencesFactory реализация, которая подключается к нему и управляет операциями чтения-записи, а также структурами данных. Однако почти для всех целей достаточно реализации по умолчанию.

Каковы недостатки?

Справедливый вопрос. Существуют ограничения по длине, упомянутые ранее. И что для редактирования настроек требуются некоторые инструменты (либо предоставляемые вашей платформой, либо вами самими).

Одним из самых больших недостатков является то, что API настроек не очень хорошо масштабируется. Вы можете связать только 1 пару имя-значение с каждым узлом (значения на основе коллекций не допускаются). Но в зависимости от того, как вы их используете, это никогда не должно вызывать беспокойства.

Знание того, когда их использовать, тоже важно. Я использую Предпочтения, когда:

  • Я могу сохранить объем конфигурации небольшим.
  • Мне нужно полагаться на JRE, чтобы принимать правильные решения о том, где хранить настройки.
  • Настройки меняются не часто, если вообще когда-либо меняются.
  • В приложение может быть встроен редактор настроек (включая веб-приложения), или у меня есть инструменты, которые позволяют мне редактировать их.

Вы Сами Ими Пользуетесь?

да я делаю. Посмотрите некоторые утилиты в моем репозитории Dotfiles . Там вы увидите инструменты настроек, которые я написал для поддержки своих приложений. Кроме того, смотрите мой проект щука . Предпочтения соответствуют тому, как я разрабатываю некоторые вещи. Они предназначены не только для приложений с графическим интерфейсом. Это одна из тех мелочей, которые есть в JDK и которые хорошо справляются с этой задачей.

Оригинал: “https://dev.to/argherna/the-java-preferences-api-is-a-little-thing-thats-a-huge-benefit-13ac”