Manifold — это плагин компилятора Java. Используйте его, чтобы дополнить свои Java-проекты высокопроизводительными функциями.
Расширенное метапрограммирование во время компиляции безопасно интегрирует любые типы данных, метаданных или DSL непосредственно в Java.
Мощные улучшения языка значительно повышают производительность разработчиков.
Каждая функция доступна как отдельная зависимость. Просто добавьте выбранные вами зависимости Manifold в существующий проект и начните использовать их преимущества.
Все они полностью поддерживаются в версиях JDK LTS 8–21+ новейших с полной поддержкой IDE в IntelliJ IDEA и Android Studio .
Что нового...
Типобезопасный SQL
Manifold SQL позволяет писать собственный SQL напрямую и безопасно с точки зрения типов в коде Java.
- Типы запросов мгновенно доступны при вводе собственного SQL любой сложности в код Java.
- Типы схем автоматически извлекаются из вашей базы данных, обеспечивая типобезопасный CRUD, несвязанную передачу и многое другое.
- Нет ORM, нет DSL, нет проводки и нет шагов сборки для генерации кода.
Выборка компаний, использующих Manifold:
Используйте платформу, чтобы получить прямой, типобезопасный доступ к любому типу ресурсов, например SQL , JSON , GraphQL , XML , YAML , CSV и даже к другим языкам, таким как JavaScript . Удалите этап генерации кода в процессе сборки. ▶ Проверьте это!
SQL: используйте собственный SQL любой сложности напрямую и безопасно с точки зрения типов из Java.
Language english =
"[.sql/]select * from Language where name = 'English'" . fetchOne ();
Film film = Film . builder ( "My Movie" , english )
. withDescription ( "Nice movie" )
. withReleaseYear ( 2023 )
. build ();
MyDatabase . commit ();
GraphQL: используйте типы, определенные в файлах .graphql напрямую , без необходимости создания кода! Вносите изменения в GraphQL и сразу же используйте их при дополнении кода.
var query = MovieQuery . builder ( Action ). build ();
var result = query . request ( "http://com.example/graphql" ). post ();
var actionMovies = result . getMovies ();
for ( var movie : actionMovies ) {
out . println (
"Title: " + movie . getTitle () + " n " +
"Genre: " + movie . getGenre () + " n " +
"Year: " + movie . getReleaseDate (). getYear () + " n " );
}
JSON: используйте файлы схемы .json напрямую и с соблюдением типов, без необходимости создания кода! Найдите способы использования свойств .json в вашем Java-коде.
// From User.json
User user = User . builder ( "myid" , "mypassword" , "Scott" )
. withGender ( male )
. withDob ( LocalDate . of ( 1987 , 6 , 15 ))
. build ();
User . request ( "http://api.example.com/users" ). postOne ( user );
Добавляйте свои собственные методы к существующим классам Java, даже к String , List и File . Устраните шаблонный код. ▶ Проверьте это!
String greeting = "hello" ;
greeting . myMethod (); // Add your own methods to String!
Отдавайте предпочтение композиции, а не наследованию. Используйте @link
и @part
для автоматической пересылки реализации интерфейса и истинного делегирования.
class MyClass implements MyInterface { @ link MyInterface myInterface ; // transfers calls on MyInterface to myInterface public MyClass ( MyInterface myInterface ) { this . myInterface = myInterface ; // dynamically configure behavior } // No need to implement MyInterface here, but you can override myInterface as needed }
Устраните шаблонный код получения/установки, улучшите общий опыт разработки свойств.
public interface Book {
@ var String title ; // no more boilerplate code!
}
// refer to it directly by name
book . title = "Daisy" ; // calls setter
String name = book . title ; // calls getter
book . title += " chain" ; // calls getter & setter
Кроме того, эта функция автоматически выводит свойства как из существующих исходных файлов, так и из скомпилированных классов, которые использует ваш проект. Уменьшите использование собственности за счет этого:
Actor person = result . getMovie (). getLeadingRole (). getActor ();
Likes likes = person . getLikes ();
likes . setCount ( likes . getCount () + 1 );
на это:
result . movie . leadingRole . actor . likes . count ++;
Реализуйте операторные методы для любого типа, чтобы напрямую поддерживать арифметические, реляционные, индексные и единичные операторы.
// BigDecimal expressions
if ( bigDec1 > bigDec2 ) {
BigDecimal result = bigDec1 + bigDec2 ;
...
}
// Implement operators for any type
MyType value = myType1 + myType2 ;
Выражения кортежа предоставляют краткий синтаксис для группировки именованных элементов данных в упрощенную структуру.
var t = ( name : "Bob" , age : "35" );
System . out . println ( "Name: " + t . name + " Age: " + t . age );
var t = ( person . name , person . age );
System . out . println (" Name : " + t . name + " Age : " + t . age );
Вы также можете использовать кортежи с новым auto
выводом типа, чтобы включить несколько возвращаемых значений из метода.
Операции модуля или привязки уникальны для платформы Manifold. Они обеспечивают очень краткий синтаксис и могут применяться к широкому спектру приложений.
import static manifold . science . util . UnitConstants .*; // kg, m, s, ft, etc
...
Length distance = 100 mph * 3 hr ;
Force f = 5.2 kg m / s / s ; // same as 5.2 N
Mass infant = 9 lb + 8.71 oz ;
Легко работайте с Range API, используя выражения единиц измерения. Просто импортируйте константы RangeFun для создания диапазонов.
// imports the `to`, `step`, and other "binding" constants
import static manifold . collections . api . range . RangeFun .*;
...
for ( int i : 1 to 5 ) {
out . println ( i );
}
for ( Mass m : 0 kg to 10 kg step 22 r unit g ) {
out . println ( m );
}
Используйте структуру многообразия для безопасного внедрения единиц измерения и точных измерений в ваши приложения.
import static manifold . science . util . UnitConstants .*; // kg, m, s, ft, etc.
...
Velocity rate = 65 mph ;
Time time = 1 min + 3.7 sec ;
Length distance = rate * time ;
Используйте знакомые директивы, такие как #define и #if, для условной компиляции ваших проектов Java. Препроцессор предлагает простой и удобный способ поддержки нескольких целей сборки с помощью одной базы кода. ▶ Проверьте это!
# if JAVA_8_OR_LATER
@ Override
public void setTime ( LocalDateTime time ) {...}
# else
@ Override
public void setTime ( Calendar time ) {...}
# endif
Унифицируйте разрозненные API. Компоненты программного обеспечения Bridge, которые вы не контролируете. Доступ к картам через типобезопасные интерфейсы. ▶ Проверьте это!
Map < String , Object > map = new HashMap <>();
MyThingInterface thing = ( MyThingInterface ) map ; // O_o
thing . setFoo ( new Foo ());
Foo foo = thing . getFoo ();
out . println ( thing . getClass ()); // prints "java.util.HashMap"
Получите доступ к частным функциям с помощью @Jailbreak, чтобы избежать рутинной работы и уязвимостей отражения Java. ▶ Проверьте это!
@ Jailbreak Foo foo = new Foo ();
// Direct, *type-safe* access to *all* foo's members
foo . privateMethod ( x , y , z );
foo . privateField = value ;
Теперь у вас есть возможность заставить проверенные исключения вести себя как непроверенные исключения! Больше нет непреднамеренного проглатывания исключений. Больше не нужно пытаться / ловить / обертывать / перебрасывать шаблонный шаблон!
List < String > strings = ...;
List < URL > urls = strings . stream ()
. map ( URL :: new ) // No need to handle the MalformedURLException!
. collect ( Collectors . toList ());
Встроенные переменные и выражения в строковых литералах, больше никаких громоздких конкатов строк! ▶ Проверьте это!
int hour = 15 ;
// Simple variable access with '$'
String result = "The hour is $hour" ; // Yes!!!
// Use expressions with '${}'
result = "It is ${hour > 12 ? hour-12 : hour} o'clock" ;
Создавайте файлы шаблонов, используя всю выразительную мощь Java, используйте свои шаблоны непосредственно в своем коде в качестве типов. Поддерживает безопасное по типам включение других шаблонов, общих макетов и т. д. ▶ Проверьте это!
List < User > users = ...;
String content = abc . example . UserSample . render ( users );
Файл шаблона abc/example/UserSample.html.mtl.
< %@ import java.util.List % >
< %@ import com.example.User % >
< %@ params(List < User > users) % >
< html lang =" en " >
< body >
< % for(User user: users) { % >
< % if(user.getDateOfBirth() != null) { % >
User: ${user.getName()} < br >
DOB: ${user.getDateOfBirth()} < br >
< % } % >
< % } % >
</ body >
</ html >
Используйте плагин Manifold, чтобы полностью использовать Manifold с IntelliJ IDEA и Android Studio . Плагин обеспечивает комплексную поддержку Manifold, включая завершение кода, навигацию, поиск использования, рефакторинг, инкрементную компиляцию, отладку с горячей заменой, полнофункциональное редактирование шаблонов, встроенный препроцессор и многое другое.
Загрузите плагин с JetBrains Marketplace.
Проект Manifold состоит из базовой структуры Manifold и набора подпроектов, реализующих SPI, предоставляемые основной структурой. Каждый проект состоит из одной или нескольких зависимостей, которые вы можете легко добавить в свой проект:
Коллектор: Сердечник
Коллектор: Расширения
Многообразие: Делегирование
Коллектор: Свойства
Многообразие: кортежи
Многообразие: SQL
Многообразие: GraphQL
Многообразие: JSON
Многообразие: XML
Коллектор: YAML
Коллектор: CSV
Манифольд: файлы свойств
Коллектор: Изображение
Коллектор: Темная Ява
Многообразие: JavaScript
Многообразие: Шаблоны Java
Многообразие: строковая интерполяция
Многообразие: (не)проверенные исключения
Манифольд: Препроцессор
Коллектор: Наука
Коллекторы: Коллекции
Коллектор: I/0
Коллектор: Текст
Поэкспериментируйте с примерами проектов:
- Манифольд: пример приложения
- Многообразие: пример приложения SQL
- Многообразие: пример приложения GraphQL
- Многообразие: пример приложения REST API
- Манифольд: пример веб-приложения
- Многообразие: пример проекта Gradle
- Манифолд: пример приложения на Kotlin
Коллектор поддерживает:
Комплексная поддержка IDE также доступна для IntelliJ IDEA и Android Studio.
Присоединяйтесь к нашему серверу Discord, чтобы начать обсуждение, задать вопросы, оставить отзыв и т. д. Обычно кто-то всегда готов помочь.