Manifold est un plugin de compilateur Java. Utilisez-le pour compléter vos projets Java avec des fonctionnalités hautement productives.
La métaprogrammation avancée au moment de la compilation intègre en toute sécurité tout type de données, métadonnées ou DSL directement dans Java.
De puissantes améliorations linguistiques améliorent considérablement la productivité des développeurs.
Chaque fonctionnalité est disponible en tant que dépendance distincte. Ajoutez simplement les dépendances Manifold de votre choix à votre projet existant et commencez à en profiter.
Tous entièrement pris en charge dans les versions 8 à 21 et plus récentes du JDK LTS avec une prise en charge complète de l'IDE dans IntelliJ IDEA et Android Studio .
Quoi de neuf...
SQL de type sécurisé
Manifold SQL vous permet d'écrire du SQL natif directement et en toute sécurité dans votre code Java.
- Les types de requêtes sont instantanément disponibles lorsque vous tapez du SQL natif de toute complexité dans votre code Java.
- Les types de schéma sont automatiquement dérivés de votre base de données, fournissant un CRUD sécurisé, un TX découplé, etc.
- Pas d'étapes de construction ORM, pas de DSL, pas de câblage et pas de génération de code
Échantillonnage d'entreprises utilisant Manifold :
Utilisez le framework pour obtenir un accès direct et sécurisé à tout type de ressource, tel que SQL , JSON , GraphQL , XML , YAML , CSV et même d'autres langages tels que JavaScript . Supprimez l'étape de génération de code dans votre processus de génération. ▶ Vérifiez-le !
SQL : utilisez du SQL natif de toute complexité directement et en toute sécurité à partir de 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 : utilisez directement les types définis dans les fichiers .graphql, sans étapes de génération de code ! Apportez des modifications à GraphQL et utilisez-les immédiatement avec la complétion du code.
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 : utilisez les fichiers de schéma .json directement et en toute sécurité, sans étapes de génération de code ! Recherchez les utilisations des propriétés .json dans votre code 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 );
Ajoutez vos propres méthodes aux classes Java existantes, même String , List et File . Éliminez le code passe-partout. ▶ Vérifiez-le !
String greeting = "hello" ;
greeting . myMethod (); // Add your own methods to String!
Privilégiez la composition à l’héritage. Utilisez @link
et @part
pour le transfert automatique de l'implémentation de l'interface et une véritable délégation.
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 }
Éliminez le code getter/setter passe-partout, améliorez votre expérience globale de développement avec les propriétés.
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
De plus, la fonctionnalité déduit automatiquement les propriétés, à la fois de vos fichiers sources existants et des classes compilées utilisées par votre projet. Réduisez l’utilisation de la propriété à partir de ceci :
Actor person = result . getMovie (). getLeadingRole (). getActor ();
Likes likes = person . getLikes ();
likes . setCount ( likes . getCount () + 1 );
à ceci :
result . movie . leadingRole . actor . likes . count ++;
Implémentez des méthodes d’opérateur sur n’importe quel type pour prendre directement en charge les opérateurs arithmétiques, relationnels, d’index et d’unité.
// BigDecimal expressions
if ( bigDec1 > bigDec2 ) {
BigDecimal result = bigDec1 + bigDec2 ;
...
}
// Implement operators for any type
MyType value = myType1 + myType2 ;
Les expressions de tuple fournissent une syntaxe concise pour regrouper les éléments de données nommés dans une structure légère.
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 );
Vous pouvez également utiliser des tuples avec une nouvelle inférence de type auto
pour activer plusieurs valeurs de retour à partir d'une méthode.
Les opérations d’unité ou de liaison sont uniques au framework Manifold. Ils fournissent une syntaxe extrêmement concise et peuvent être appliqués à un large éventail d’applications.
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 ;
Travaillez facilement avec l'API Range à l'aide d'expressions unitaires. Importez simplement les constantes RangeFun pour créer des plages.
// 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 );
}
Utilisez le cadre scientifique multiple pour intégrer en toute sécurité des unités et des mesures précises dans vos applications.
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 ;
Utilisez des directives familières telles que #define et #if pour compiler conditionnellement vos projets Java. Le préprocesseur offre un moyen simple et pratique de prendre en charge plusieurs cibles de build avec une seule base de code. ▶ Vérifiez-le !
# if JAVA_8_OR_LATER
@ Override
public void setTime ( LocalDateTime time ) {...}
# else
@ Override
public void setTime ( Calendar time ) {...}
# endif
Unifiez les API disparates. Composants logiciels de pont que vous ne contrôlez pas. Accédez aux cartes via des interfaces de type sécurisé. ▶ Vérifiez-le !
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"
Accédez aux fonctionnalités privées avec @Jailbreak pour éviter la corvée et la vulnérabilité de la réflexion Java. ▶ Vérifiez-le !
@ Jailbreak Foo foo = new Foo ();
// Direct, *type-safe* access to *all* foo's members
foo . privateMethod ( x , y , z );
foo . privateField = value ;
Vous avez désormais la possibilité de faire en sorte que les exceptions vérifiées se comportent comme des exceptions non vérifiées ! Fini les exceptions involontaires à la déglutition. Plus besoin d'essayer / attraper / envelopper / relancer le passe-partout !
List < String > strings = ...;
List < URL > urls = strings . stream ()
. map ( URL :: new ) // No need to handle the MalformedURLException!
. collect ( Collectors . toList ());
Variables et expressions en ligne dans les littéraux de chaîne, fini les concaténages de chaînes maladroits ! ▶ Vérifiez-le !
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" ;
Créez des fichiers modèles avec toute la puissance expressive de Java, utilisez vos modèles directement dans votre code en tant que types. Prend en charge l’inclusion sécurisée d’autres modèles, mises en page partagées, etc. ▶ Vérifiez-le !
List < User > users = ...;
String content = abc . example . UserSample . render ( users );
Un fichier modèle 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 >
Utilisez le plugin Manifold pour exploiter pleinement Manifold avec IntelliJ IDEA et Android Studio . Le plugin fournit une prise en charge complète de Manifold, y compris la complétion de code, la navigation, la recherche d'utilisation, la refactorisation, la compilation incrémentielle, le débogage hotswap, l'édition de modèles complète, le préprocesseur intégré, etc.
Obtenez le plugin sur JetBrains Marketplace
Le projet Manifold se compose du cadre de base Manifold et d'un ensemble de sous-projets mettant en œuvre les SPI fournis par le cadre de base. Chaque projet est constitué d'une ou plusieurs dépendances que vous pouvez facilement ajouter à votre projet :
Collecteur : Noyau
Collecteur : Rallonges
Collecteur : Délégation
Collecteur : Propriétés
Collecteur : Tuples
Collecteur : SQL
Collecteur : GraphQL
Collecteur : JSON
Collecteur : XML
Collecteur : YAML
Collecteur : CSV
Collecteur : Fichiers de propriétés
Collecteur : Image
Collecteur : Java foncé
Collecteur : JavaScript
Collecteur : modèles Java
Collecteur : Interpolation de chaînes
Collecteur : Exceptions (non) vérifiées
Collecteur : Préprocesseur
Collecteur : Science
Collecteur : Collections
Collecteur : I/0
Collecteur : Texte
Expérimentez avec des exemples de projets :
- Collecteur : exemple d'application
- Collecteur : exemple d'application SQL
- Manifold : exemple d'application GraphQL
- Manifold : exemple d'application API REST
- Collecteur : exemple d'application Web
- Manifold : exemple de projet Gradle
- Manifold : exemple d'application Kotlin
Supports collecteurs :
Une prise en charge complète de l'IDE est également disponible pour IntelliJ IDEA et Android Studio.
Rejoignez notre serveur Discord pour démarrer une discussion, poser des questions, fournir des commentaires, etc. Quelqu'un est généralement là pour vous aider.