Java-библиотека: создание, обработка, работа с файлами
Java является одним из столпов мира с открытым исходным кодом. Каждый его проект использует другие приложения с открытым исходным кодом, их достаточно в сети и пользователям не требуется "изобретать велосипед". Тем не менее часто случается, что разработчикам для функциональности нужна особая Java-библиотека (Library), и они понятия не имеют, как ее создавать.
Ключевые принципы дизайна
Повторное использование кода является одним из священных Граалей компьютерного программирования. Написание кода, который можно легко повторно применять, требует обладания сложных навыков, но, безусловно, его может освоить каждый желающий. Язык Java может помочь создать хорошую многоразовую платформу. Для этого разработчику необходимо иметь базовые знания по программированию, включая умение создавать, компилировать и выполнять простые программы из командной строки.
Несколько ключевых принципов хорошего дизайна Java-библиотеки:
- Она четко должна передавать свою внутреннюю структуру таким образом, что пользователь знает, как ее использовать, даже если не понимает, как она работает изнутри.
- Инкапсуляция - ужесточение и уточнение интерфейса кода, что делает его более надежным и понятным.
- Расширяемость - создание Java-библиотеки, которая хорошо выполняет свою задачу и предоставляет возможность заполнить недостающие части для удовлетворения потребностей конкретного разработчика.
- Наследование - обеспечивает способ настройки кода без необходимости знать все детали кода, который настраивается.
- Предоставление способа получения отладочной информации из кода - помогает пользователям находить собственные ошибки.
Границы функциональности: вход и выход
Проблема в том, что не все дизайнеры Java-библиотек думают о своих пользователях, о том, как API будет применяться на практике и как будет выглядеть и тестироваться код.
Границы функциональности - это, пожалуй, самая важная тема. Хорошей практикой является прохождение всех зависимостей через конструкторы и их краткость с несколькими параметрами. Если нужен конструктор с более чем тремя или четырьмя параметрами, тогда ясно, что код должен быть реорганизован.
Также разработчики всегда должны предлагать пользователям более одного конструктора. Клиенты должны работать со String и Integer, чтобы они могли передавать ByteArrayInputStream при тестировании модулей.
Например, несколько способов создания точки входа API Github с помощью jcabi-github:
- Github noauth = new RtGithub();
- Github basicauth = new RtGithub("username", "password");
- Github oauth = new RtGithub("token").
В качестве второго примера, как работать с charles, Java-библиотекой профессионала для веб-сканирования, можно прописать следующее.
По умолчанию шаблоны не должны игнорироваться. Переменная indexPage - это URL-адрес, с которого должен начаться обход контента, драйвер - это используемый браузер. По умолчанию он ничего не может сделать, поскольку неизвестно, какой браузер установлен на работающей машине. Выход нужен в основном для Library, которая общается с внешним миром. Здесь нужно ответить на вопрос, как он будет обрабатываться.
Для этого нужно прописать что-то вроде этого:
WebCrawl graph = new GraphCrawl(...);List pages = graph.crawl();
Интерфейс и третьи лица
Разработчик всегда должен использовать интерфейсы, а пользователь обязан взаимодействовать с кодом только через строгие контракты. Например, в библиотеке jcabi-github класс RtGithub si единственный, который он видит.
Приведенный выше фрагмент создает заявку в репозитории eugenp/tutorials. Экземпляры Repo и Issue применяются, но фактические типы никогда не раскрываются. Сценарий, приведенный выше, может быть разрешен, но тогда разработанный алгоритм будет загрязнен большим количеством стандартного кода.
Интерфейсы также обеспечивают простоту расширения и обратной совместимости. С одной стороны разработчики обязаны соблюдать уже выпущенные контракты, а с другой - пользователь расширяет предлагаемые интерфейсы: он может их украшать или писать альтернативные реализации.
Хорошая библиотека - легковесная. Код должен решить проблему и быть функциональным. Если нужно много зависимостей. Вероятно, разработчик пытается охватить слишком большое количество функций и должен разбить проект на несколько малых.
Проект должен быть максимально прозрачным. Лучший пример - использовать SLF4J с API для ведения журнала. Не стоит применять log4j напрямую, возможно, разработчик захочет применить другие средства ведения журнала.
Подключение Java-библиотек документов, которые переходят через проект транзитивно, выполняют, чтобы не включались опасные зависимости, такие как xalan или xml-apis.
В мире существует сотни тысяч библиотек, но программистам требуется знание только небольшого количества наиболее функциональных модулей.
Библиотека модульного тестирования
У разработчиков очень распространены модули логов, они нужны в каждом проекте. Особенно важны для серверных приложений, потому что журналы размещаются только там, где можно видеть, что происходит в них. Несмотря на то что JDK поставляется с собственной библиотекой журналирования, существуют лучшие альтернативы, например, Log4j, SLF4j и LogBack. Разработчик Java должен быть знаком с плюсами и минусами библиотек журналов и знать, почему использование SLF4j лучше, чем простой Log4j.
В современном мире веб-сервисов и IoT JSON стал протоколом перехода для передачи информации от клиента к серверу. Он заменил XML, как наиболее предпочтительный способ передачи информации независимо от платформы. К сожалению, JDK не имеет Library JSON. Но есть много хороших сторонних модулей, которые позволяют анализировать и создавать сообщения, например, Джексон. Веб-разработчик должен быть знаком хотя бы с одной из этих библиотек.
Модульное тестирование - это самая важная функция, которая отделяет обычного разработчика от профессионала. Программистам часто прощают за то, что они не пишут модульные тесты, и наиболее распространенным оправданием для отсутствия такого тестирования является нехватка опыта и знаний популярных библиотек модульного тестирования, включая JUnit, Mockito и PowerMock.
Разработчикам Java доступно несколько хороших сторонних библиотек общего назначения, таких как Apache Commons и Google Guava. Они упрощают множество задач. Как справедливо сказал Джошуа Блох в «Эффективной Яве», нет смысла заново изобретать колесо, лучше использовать проверенные и протестированные модули, вместо того чтобы писать свои собственные подпрограммы. Разработчику Java полезно ознакомиться с Google Guava и библиотекой Apache Commons.
Платформа с HTTP-поддержкой
Многим разработчикам не нравится в JDK отсутствие поддержки HTTP. Можно установить HTTP-соединение, используя классы в java.net пакет сторонних библиотек с открытым исходным кодом, такие как Apache HttpClient и HttpCore.
Хотя в JDK 9 реализована поддержка HTTP 2.0 и улучшена поддержка HTTP, специалисты рекомендуют разработчикам ознакомиться с популярными клиентскими библиотеками HTTP, включая HttpClient и HttpCore.
Существуют библиотеки разбора XML, включая Xerces, JAXB, JAXP, Dom4j и Xstream. Xerces2 - это новое поколение высокопроизводительных, полностью совместимых анализаторов XML в семействе Apache Xerces. Новая версия Xerces представляет собственный интерфейс Xerces (XNI), полную платформу для создания компонентов и конфигураций синтаксического анализатора, которая является чрезвычайно модульной и простой в программировании.
Парсер Apache Xerces2 является эталонной реализацией XNI, но другие компоненты конфигурации могут быть написаны с использованием собственного интерфейса Xerces. Dom4j - еще одна гибкая структура XML для создания библиотеки Java.
Программы реального мира должны взаимодействовать с Microsoft Office в той или иной форме. Многие из них должны предоставлять функциональные возможности для экспорта данных в Excel, и если это нужно сделать из Java-приложения, потребуется API-интерфейс Apache POI. Это очень богатая библиотека, которая позволяет читать и записывать файлы XLS из Java-программы.
Если программист пишет каркас, который генерирует код или взаимодействует с байт-кодами, то ему нужна библиотека байт-кодов. Она позволяет читать и изменять байт-код, сгенерированный приложением. Некоторые из популярных Library байт - это javassist и Cglib Nodep. Помощник Java-программирования делает манипулирование байт-кодом очень простым. ASM - еще один полезный модуль для его редактирования.
Повсеместный формат PDF
Подобно Microsoft Excel, библиотеки PDF являются еще одним повсеместным форматом. Если необходимо поддерживать функциональность PDF в приложении, например, экспортировать данные в файлы PDF, то можно применить модули iText и Apache FOP. Оба предоставляют полезную функциональность, связанную с PDF, но iText лучше.
До Java 8 модули данных и времени JDK имели недостатки, потому что они не были поточно-ориентированными и подвергались ошибками. Java-разработчики полагались на JodaTime для реализации требований к дате и времени. В JDK 8 нет причин использовать Joda, потому что пользователь получает эти функциональные возможности в новом API даты и времени, но для старой версии Java стоит изучить эту библиотеку.
Несмотря на то, что JDK обладает богатой коллекцией, есть сторонние модули, предоставляющие больше возможностей, такие как коллекции Apache Commons, Goldman Sachs, Google и Trove. Library Trove особенно полезна, поскольку обеспечивает высокоскоростные регулярные и примитивные коллекции для Java.
Javax.mail и Apache Commons Email предоставляют API для отправки электронной почты с Java. Он построен поверх API JavaMail, который создан для упрощения работ.
Криптографический пакет кодеков
Apache Commons содержит простой кодер и декодеры для различных форматов, таких как Base64 и Hexadecimal. В дополнение к этим широко используемым кодерам и декодерам, он поддерживает набор утилит фонетического кодирования. Библиотеки встроенных баз данных SQL, такие как H2, которые можно встроить в Java-приложении, отлично подходят для тестирования SQL-скриптов и запуска модульных тестов, которым нужна база данных. Однако H2 - не единственная БД, также существует на выбор Apache Derby и HSQL.
Библиотеки устранения неполадок JDBC призваны облегчить отладку, например, P6spy. Это модуль, который позволяет легко перехватывать данные БД и регистрировать их без изменения кода программы. Можно использовать их для регистрации запросов SQL и их времени. Например, если применяют PreparedStatment и CallableStatement в коде, эти Library могут регистрировать точный вызов с параметрами и с определением времени необходимого для выполнения.
Буферы протокола Google - это способ кодирования структурированных данных в эффективном, но расширяемом формате. Это более богатая и лучшая альтернатива сериализации Java. Некоторые из полезных сетевых библиотек - Netty и Apache MINA. Если разработчик пишет программу, в которой нужно выполнить низкоуровневую сетевую задачу, то он использует эти модули.
Java Json библиотеки
Есть надежные библиотеки JSON для сериализации/десериализации. Можно найти детали о Джексоне в репозитории GitHub.
Она предоставлена Дугом Крокфордом и была введена в платформу JavaEE 7, как часть инициативы 353 «Запрос спецификации Java» (JSR) и является автономной реализацией, которую можно интегрировать с SE, начиная с версии 8.
Девятая модификация обеспечивает собственную поддержку JSON в рамках инициативы Enhancement Proposal (JEP) 198.
Преимущества Джексона:
- Широко используется, особенно сообществом Spring.
- Обеспечивает отличную функциональность.
- Хорошо работает в течение длительного времени.
- Хорошо поддерживается с активным сообществом развития.
- Имеет хорошую документацию.
- Поддерживает фокус, придерживаясь одной библиотеки Java/JSON.
Вот самые важные классы и методы Джексона, которые сериализуют/десериализуют в JSON:
- ObjectMapper - преобразует конструкции между Java и JSON.
- ObjectMapper.writeValue - преобразует тип данных Java в JSON и в этом случае выводит в Writer.
- ObjectMapper.readValue - преобразует JSON в тип данных Java.
Запускают одиночный модульный тест из командной строки следующим образом:
cd chapter-4/speakers-test
+gradle test --tests org.jsonatwork.ch4.BasicJsonTypesTest+
Обучающие книги Horstmann
Многообразие библиотек заставляет программистов находить исчерпывающее, но сжатое руководство по всем новым функциям Java SE 9. В этом им помогают книги Хорстманна, особенно интересно начинающим пользователям десятое издание книги «Java-библиотека профессионала».
Кей С. Хорстманн - профессор компьютерных наук государственного университета Сан-Хосе. Он является опытным профессиональным программистом и консультантом для крупных корпораций, университетов и организаций по Java, C ++, Windows и интернет-программирования. Хорстманн является автором многих успешных профессиональных и академических книг, включая "Big C ++", "C ++ для всех", "Big Java", "Объектно-ориентированный дизайн и шаблоны".
Книга Корнелла Хорстманн «Java-библиотека профессионала» охватывает все важные аспекты языка, которые должен знать современный разработчик, включая модульность, а также мощные лямбда-выражения, представленные в 8-й версии. В них изложены основы программирования с использованием Java в более доступном и менее строгом подходе.
Книга предоставляет более удобный интенсивный графический дизайн, который передает сложные концепции просто и эффективно. Она отличается от других книг на рынке тем, что фокусируется на таких темах, как циклы и графические интерфейсы, при этом избегая ориентации на объектную ориентацию. Акцент делается на простые программы, которые используют предварительно созданные структуры данных и алгоритмы.
В примерах и тематических исследованиях рассматриваются практические приложения, которые могут оказаться полезными программистам, ученым и инженерам, например, обработка табличных данных, сбор информации в интернете, графические библиотеки Java для создания пользовательских графических изображений и интерфейсов.
Способы улучшение производительности Library
С JSON легко работать и он стал стандартным форматом данных практически для всего. В Stackify широко применяют JSON для API-интерфейсов REST, сериализации сообщений в очереди и многого другого.
Некоторые общие советы по производительности JSON:
- Использовать несколько библиотек JSON для оптимальной производительности и функций.
- Использовать потоки, когда это возможно.
- Сжимать пользовательский JSON. Поскольку это просто текст, можно рассчитывать на сжатие до 90%. Поэтому применяют «zip» везде, где это возможно.
- Избегать анализа, если это не нужно.
- Выполнять сериализацию/десериализацию больших и меньших объектов JSON. В некоторых случаях, когда нужно получить массив больших объектов, его разбивают на более мелкие части.
- Настроить анализатор JSON Web API.
- Не сериализовать все поля, нулевые значения или значения по умолчанию.
- Использовать более короткие имена полей.
- Ручная сериализация или разбор могут быть быстрее.
Приложения на самом деле являются обычными компьютерными программами, работающими на многих устройствах реального мира. Они имеют особую возможность доступа к датчикам и аппаратным средствам управления. Для этого производители предоставляют так называемые библиотеки программирования, которые позволяют относительно легко использовать аппаратное обеспечение в разработанной программе.