Manifold é um plugin do compilador Java. Use-o para complementar seus projetos Java com recursos altamente produtivos.
A metaprogramação avançada em tempo de compilação integra com segurança qualquer tipo de dados, metadados ou DSL diretamente em Java.
Aprimoramentos poderosos de linguagem melhoram significativamente a produtividade do desenvolvedor.
Cada recurso está disponível como uma dependência separada. Basta adicionar as dependências do Manifold de sua escolha ao seu projeto existente e começar a aproveitá-las.
Tudo totalmente compatível com as versões 8 a 21 do JDK LTS mais recentes, com suporte IDE abrangente no IntelliJ IDEA e no Android Studio .
O que há de novo...
SQL com segurança de tipo
O Manifold SQL permite que você escreva SQL nativo diretamente e digite com segurança em seu código Java.
- Os tipos de consulta ficam disponíveis instantaneamente conforme você digita SQL nativo de qualquer complexidade em seu código Java
- Os tipos de esquema são derivados automaticamente do seu banco de dados, fornecendo CRUD com segurança de tipo, TX desacoplado e muito mais
- Sem ORM, sem DSL, sem fiação e sem etapas de construção de geração de código
Amostragem de empresas que utilizam o Manifold:
Use a estrutura para obter acesso direto e seguro a qualquer tipo de recurso, como SQL , JSON , GraphQL , XML , YAML , CSV e até mesmo outras linguagens, como JavaScript . Remova a etapa de geração de código do seu processo de construção. ▶ Confira!
SQL: Use SQL nativo de qualquer complexidade diretamente e com segurança de digitação em 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 em arquivos .graphql diretamente , sem etapas de geração de código! Faça alterações no GraphQL e use-as imediatamente com o preenchimento de 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: use arquivos de esquema .json diretamente e com digitação segura, sem etapas de geração de código! Encontre usos de propriedades .json em seu 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 );
Adicione seus próprios métodos às classes Java existentes, até mesmo String , List e File . Elimine o código padrão. ▶ Confira!
String greeting = "hello" ;
greeting . myMethod (); // Add your own methods to String!
Favorecer a composição em vez da herança. Use @link
e @part
para encaminhamento automático de implementação de interface e delegação verdadeira .
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 o código getter/setter padrão e melhore sua experiência geral de desenvolvimento com propriedades.
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
Além disso, o recurso infere automaticamente propriedades, tanto dos arquivos de origem existentes quanto das classes compiladas que seu projeto usa. Reduza o uso da propriedade com isso:
Actor person = result . getMovie (). getLeadingRole (). getActor ();
Likes likes = person . getLikes ();
likes . setCount ( likes . getCount () + 1 );
para isso:
result . movie . leadingRole . actor . likes . count ++;
Implemente métodos de operador em qualquer tipo para oferecer suporte direto a operadores aritméticos, relacionais, de índice e de unidade.
// BigDecimal expressions
if ( bigDec1 > bigDec2 ) {
BigDecimal result = bigDec1 + bigDec2 ;
...
}
// Implement operators for any type
MyType value = myType1 + myType2 ;
As expressões de tupla fornecem sintaxe concisa para agrupar itens de dados nomeados em uma estrutura leve.
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 );
Você também pode usar tuplas com a nova inferência auto
de tipo para habilitar vários valores de retorno de um método.
As operações unitárias ou vinculativas são exclusivas da estrutura Manifold. Eles fornecem uma sintaxe poderosamente concisa e podem ser aplicados a uma ampla gama de aplicações.
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 ;
Trabalhe facilmente com a API Range usando expressões unitárias. Basta importar as constantes RangeFun para criar intervalos.
// 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 );
}
Use a estrutura da ciência múltipla para incorporar unidades e medições precisas com segurança em suas aplicações.
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 ;
Use diretivas familiares como #define e #if para compilar condicionalmente seus projetos Java. O pré-processador oferece uma maneira simples e conveniente de oferecer suporte a vários alvos de construção com uma única base de código. ▶ Confira!
# if JAVA_8_OR_LATER
@ Override
public void setTime ( LocalDateTime time ) {...}
# else
@ Override
public void setTime ( Calendar time ) {...}
# endif
Unifique APIs diferentes. Componentes de software Bridge que você não controla. Acesse mapas por meio de interfaces de tipo seguro. ▶ Confira!
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"
Acesse recursos privados com @Jailbreak para evitar o trabalho enfadonho e a vulnerabilidade da reflexão Java. ▶ Confira!
@ Jailbreak Foo foo = new Foo ();
// Direct, *type-safe* access to *all* foo's members
foo . privateMethod ( x , y , z );
foo . privateField = value ;
Agora você tem a opção de fazer com que as exceções verificadas se comportem como exceções não verificadas! Chega de engolir exceções não intencionais. Chega de clichês de tentar / capturar / embrulhar / relançar !
List < String > strings = ...;
List < URL > urls = strings . stream ()
. map ( URL :: new ) // No need to handle the MalformedURLException!
. collect ( Collectors . toList ());
Variáveis inline e expressões em literais String, chega de concat de strings desajeitadas! ▶ Confira!
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" ;
Crie arquivos de modelo com todo o poder expressivo do Java e use seus modelos diretamente em seu código como tipos. Suporta inclusão segura de outros modelos, layouts compartilhados e muito mais. ▶ Confira!
List < User > users = ...;
String content = abc . example . UserSample . render ( users );
Um arquivo de modelo 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 >
Use o plug-in Manifold para aproveitar totalmente o Manifold com IntelliJ IDEA e Android Studio . O plug-in fornece suporte abrangente para Manifold, incluindo conclusão de código, navegação, pesquisa de uso, refatoração, compilação incremental, depuração de hotswap, edição de modelo completa, pré-processador integrado e muito mais.
Obtenha o plugin do JetBrains Marketplace
O projeto Manifold consiste na estrutura principal do Manifold e em uma coleção de subprojetos que implementam SPIs fornecidos pela estrutura principal. Cada projeto consiste em uma ou mais dependências que você pode adicionar facilmente ao seu projeto:
Coletor: Núcleo
Coletor: Extensões
Coletor: Delegação
Coletor: Propriedades
Variedade: Tuplas
Coletor: SQL
Coletor: GraphQL
Coletor: JSON
Coletor: XML
Coletor: YAML
Coletor: CSV
Coletor: Arquivos de Propriedades
Coletor: Imagem
Coletor: Dark Java
Variedade: JavaScript
Coletor: Modelos Java
Manifold: Interpolação de String
Coletor: exceções (des) verificadas
Coletor: Pré-processador
Variedade: Ciência
Coletor: Coleções
Coletor: I/0
Variedade: Texto
Experimente projetos de amostra:
- Coletor: aplicativo de exemplo
- Coletor: exemplo de aplicativo SQL
- Manifold: exemplo de aplicativo GraphQL
- Coletor: exemplo de aplicativo REST API
- Coletor: exemplo de aplicativo da Web
- Manifold: Projeto de exemplo Gradle
- Coletor: exemplo de aplicativo Kotlin
Suportes múltiplos:
Suporte abrangente a IDE também está disponível para IntelliJ IDEA e Android Studio.
Junte-se ao nosso servidor Discord para iniciar uma discussão, fazer perguntas, fornecer feedback, etc.