Manifold es un complemento del compilador de Java. Úselo para complementar sus proyectos Java con funciones altamente productivas.
La metaprogramación avanzada en tiempo de compilación integra de forma segura cualquier tipo de datos, metadatos o DSL directamente en Java.
Potentes mejoras del lenguaje mejoran significativamente la productividad de los desarrolladores.
Cada característica está disponible como una dependencia separada. Simplemente agregue las dependencias Manifold que elija a su proyecto existente y comience a aprovecharlas.
Todo totalmente compatible con las versiones 8 - 21 y posteriores de JDK LTS, con compatibilidad integral con IDE en IntelliJ IDEA y Android Studio .
Qué hay de nuevo...
SQL con seguridad de tipos
Manifold SQL le permite escribir SQL nativo directamente y escribir de forma segura en su código Java.
- Los tipos de consultas están disponibles instantáneamente a medida que escribe SQL nativo de cualquier complejidad en su código Java
- Los tipos de esquema se derivan automáticamente de su base de datos, proporcionando CRUD con seguridad de tipos, TX desacoplado y más
- Sin ORM, sin DSL, sin cableado y sin pasos de compilación de generación de código
Muestreo de empresas que utilizan Manifold:
Utilice el marco para obtener acceso directo y seguro a cualquier tipo de recurso, como SQL , JSON , GraphQL , XML , YAML , CSV e incluso otros lenguajes como JavaScript . Elimine el paso de generación de código en su proceso de compilación. ▶ ¡ Compruébalo!
SQL: utilice SQL nativo de cualquier complejidad directamente y con escritura segura desde 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: use tipos definidos en archivos .graphql directamente , ¡sin pasos de generación de código! Realice cambios en GraphQL y utilícelos inmediatamente después de completar el código.
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: utilice archivos de esquema .json directamente y escriba de forma segura, ¡sin pasos de generación de código! Encuentre usos de las propiedades .json en su código 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 );
Agregue sus propios métodos a las clases Java existentes, incluso String , List y File . Eliminar el código repetitivo. ▶ ¡ Compruébalo!
String greeting = "hello" ;
greeting . myMethod (); // Add your own methods to String!
Favorecer la composición sobre la herencia. Utilice @link
y @part
para el reenvío automático de la implementación de la interfaz y una verdadera delegación.
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 }
Elimine el código getter/setter repetitivo y mejore su experiencia general de desarrollo con propiedades.
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
Además, la característica infiere automáticamente propiedades, tanto de sus archivos fuente existentes como de las clases compiladas que utiliza su proyecto. Reducir el uso de la propiedad de esto:
Actor person = result . getMovie (). getLeadingRole (). getActor ();
Likes likes = person . getLikes ();
likes . setCount ( likes . getCount () + 1 );
a esto:
result . movie . leadingRole . actor . likes . count ++;
Implemente métodos de operador en cualquier tipo para admitir directamente operadores aritméticos, relacionales, de índice y unitarios.
// BigDecimal expressions
if ( bigDec1 > bigDec2 ) {
BigDecimal result = bigDec1 + bigDec2 ;
...
}
// Implement operators for any type
MyType value = myType1 + myType2 ;
Las expresiones de tupla proporcionan una sintaxis concisa para agrupar elementos de datos con nombre en una estructura ligera.
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 );
También puede utilizar tuplas con nueva inferencia de tipo auto
para habilitar múltiples valores de retorno de un método.
Las operaciones unitarias o vinculantes son exclusivas del marco Manifold. Proporcionan una sintaxis poderosamente concisa y se pueden aplicar a una amplia gama de aplicaciones.
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 ;
Trabaje fácilmente con Range API utilizando expresiones unitarias. Simplemente importe las constantes de RangeFun para crear rangos.
// 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 );
}
Utilice el marco de ciencia múltiple para incorporar unidades y medidas precisas de forma segura en sus aplicaciones.
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 ;
Utilice directivas familiares como #define y #if para compilar condicionalmente sus proyectos Java. El preprocesador ofrece una forma sencilla y cómoda de admitir múltiples objetivos de compilación con una única base de código. ▶ ¡ Compruébalo!
# if JAVA_8_OR_LATER
@ Override
public void setTime ( LocalDateTime time ) {...}
# else
@ Override
public void setTime ( Calendar time ) {...}
# endif
Unifique API dispares. Conecte componentes de software que no controle. Acceda a mapas a través de interfaces con seguridad de escritura. ▶ ¡ Compruébalo!
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"
Acceda a funciones privadas con @Jailbreak para evitar la monotonía y la vulnerabilidad del reflejo de Java. ▶ ¡ Compruébalo!
@ Jailbreak Foo foo = new Foo ();
// Direct, *type-safe* access to *all* foo's members
foo . privateMethod ( x , y , z );
foo . privateField = value ;
¡Ahora tiene una opción para hacer que las excepciones marcadas se comporten como excepciones no marcadas! No más degluciones involuntarias de excepciones. ¡No más intentos , capturas , envolturas y lanzamientos repetidos !
List < String > strings = ...;
List < URL > urls = strings . stream ()
. map ( URL :: new ) // No need to handle the MalformedURLException!
. collect ( Collectors . toList ());
Variables y expresiones en línea en literales de cadena, ¡no más concatenaciones de cadenas torpes! ▶ ¡ Compruébalo!
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" ;
Cree archivos de plantilla con todo el poder expresivo de Java, utilice sus plantillas directamente en su código como tipos. Admite la inclusión segura de otras plantillas, diseños compartidos y más. ▶ ¡ Compruébalo!
List < User > users = ...;
String content = abc . example . UserSample . render ( users );
Un archivo de plantilla 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 >
Utilice el complemento Manifold para aprovechar al máximo Manifold con IntelliJ IDEA y Android Studio . El complemento brinda soporte integral para Manifold, incluida la finalización de código, navegación, búsqueda de uso, refactorización, compilación incremental, depuración de intercambio en caliente, edición de plantillas con todas las funciones, preprocesador integrado y más.
Obtenga el complemento de JetBrains Marketplace
El proyecto Manifold consta del marco principal de Manifold y una colección de subproyectos que implementan SPI proporcionados por el marco principal. Cada proyecto consta de una o más dependencias que puedes agregar fácilmente a tu proyecto:
Colector: Núcleo
Colector: Extensiones
Colector: Delegación
Colector: Propiedades
Colector: Tuplas
Colector: SQL
Colector: GraphQL
Colector: JSON
Colector: XML
Colector: YAML
Colector: CSV
Colector: Archivos de propiedades
Colector: Imagen
Colector: Java oscuro
Colector: JavaScript
Colector: Plantillas Java
Colector: Interpolación de cadenas
Colector: excepciones (des)marcadas
Colector: Preprocesador
Múltiple: Ciencia
Colector: Colecciones
Colector: I/0
Colector: Texto
Experimente con proyectos de muestra:
- Colector: aplicación de muestra
- Colector: aplicación SQL de muestra
- Colector: aplicación GraphQL de muestra
- Colector: aplicación API REST de muestra
- Colector: aplicación web de muestra
- Colector: Proyecto de ejemplo de Gradle
- Colector: aplicación Kotlin de muestra
Soportes múltiples:
También está disponible compatibilidad integral con IDE para IntelliJ IDEA y Android Studio.
Únase a nuestro servidor de Discord para iniciar una discusión, hacer preguntas, brindar comentarios, etc. Generalmente hay alguien allí para ayudar.