Мы подошли к последней части нашей серии Manifold, но не исчерпали ее замечательных возможностей. На протяжении всей этой серии мы углублялись в различные аспекты Manifold, выделяя его уникальные возможности и демонстрируя, как он улучшает разработку Java. В этой статье мы рассмотрим некоторые из оставшихся функций Manifold, включая поддержку GraphQL, интеграцию с JavaScript и использование препроцессора. Подводя итог этим функциям и размышляя над знаниями, полученными в этой серии, я надеюсь продемонстрировать мощь и универсальность Manifold.

Расширение горизонтов с поддержкой GraphQL

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

К счастью, Manifold приходит на помощь, смягчая эти проблемы и делая GraphQL доступным и пригодным для использования в проектах Java. Устранив жесткость Java и обеспечив беспрепятственную интеграцию с GraphQL, Manifold позволяет разработчикам использовать этот современный стиль API.

Например. для этого файла graphql, взятого из репозитория Manifold:

query MovieQuery($genre: Genre!, $title: String, $releaseDate: Date) {
    movies(genre: $genre, title: $title, releaseDate: $releaseDate) {
        id
        title
        genre
        releaseDate
    }
}

query ReviewQuery($genre: Genre) {
    reviews(genre: $genre) {
        id
        stars
        comment
        movie {
            id
            title
        }
    }
}

mutation ReviewMutation($movie: ID!, $review: ReviewInput!) {
    createReview(movie: $movie, review: $review) {
        id
        stars
        comment
    }
}

extend type Query {
    reviewsByStars(stars: Int) : [Review!]!
}

Мы можем написать такой плавный код:

var query = MovieQuery.builder(Action).build();
var result = query.request(ENDPOINT).post();
var actionMovies = result.getMovies();
for (var movie : actionMovies) {
  out.println(
    "Title: " + movie.getTitle() + "\n" +
    "Genre: " + movie.getGenre() + "\n" +
    "Year: " + movie.getReleaseDate().getYear() + "\n");
}

Ни один из этих объектов не нужно объявлять заранее, нам нужны только файлы GraphQL.

Достижение паритета кода с интеграцией JavaScript

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

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

Например. этот фрагмент JavaScript:

function calculateValue(total, year, rate) {
  var interest = rate / 100 + 1;
  return parseFloat((total * Math.pow(interest, year)).toFixed(4));
}

Может быть вызван из Java, как если бы это был статический метод:

var interest = Calc.calculateValue(4,1999, 5);
System.out.println(interest);

Препроцессор для Java

Хотя функциональность, подобная препроцессору, может показаться ненужной в Java из-за ее переносимого характера и JIT-компиляции, существуют сценарии, в которых условный код становится необходимым. Например, при создании приложений, требующих различного поведения в локальной и облачной средах, одной конфигурации может быть недостаточно. Технически это сработает, но может оставить проприетарный байт-код в локальных развертываниях, а это не то, чего нам бы хотелось. Для этого есть обходные пути, но они часто очень тяжелы для чего-то относительно простого.

Manifold удовлетворяет эту потребность, предлагая возможности, подобные препроцессору. Определяя значения в build.properties или через переменные среды и аргументы компилятора, разработчики могут условно выполнять определенные пути кода. Это обеспечивает гибкость и контроль, не прибегая к сложным приемам сборки или специфичному для платформы коду.

С помощью Manifold мы можем написать код препроцессора, например:

#if SERVER_ON_PREM
    onPremCode();
#elif SERVER_CLOUD
    cloudCode();
#else
    #error “Missing definition: SERVER_ON_PREM or SERVER_CLOUD”
#endif

Размышляя о силе коллектора

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

Manifold — это развивающийся проект со многими нишевыми функциями, которые я не обсуждал в этой серии, включая последнюю Поддержка SQL.

В текущем проекте Spring Boot, который я разрабатываю, я решил использовать Manifold вместо Lombok. Моим основным аргументом было то, что это стартап-проект, поэтому я более склонен рисковать. Manifold позволяет мне адаптировать себя к моим потребностям, мне не нужны многие функции, и я действительно не добавлял их все. Мне, вероятно, придется взаимодействовать с GraphQL, и это было важным решающим фактором при выборе Manifold вместо Lombok. На данный момент я очень доволен результатами, и такие функции, как компоненты управления данными, прекрасно работают с аннотациями свойств.

Однако я скучаю по аннотациям конструктора Lombok, надеюсь, что-то подобное в конечном итоге попадет в Manifold. В качестве альтернативы, если я найду время, я могу реализовать это самостоятельно.

Заключительное слово

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

Не забудьте ознакомиться с прошлыми частями этой серии, чтобы в полной мере ощутить мощь Manifold.