Manifold ist ein Java-Compiler-Plugin. Ergänzen Sie damit Ihre Java-Projekte mit hochproduktiven Funktionen.
Erweiterte Metaprogrammierung zur Kompilierungszeit integriert typsicher jede Art von Daten, Metadaten oder DSL direkt in Java.
Leistungsstarke Spracherweiterungen verbessern die Entwicklerproduktivität erheblich.
Jede Funktion ist als separate Abhängigkeit verfügbar. Fügen Sie einfach die Manifold-Abhängigkeiten Ihrer Wahl zu Ihrem bestehenden Projekt hinzu und beginnen Sie, davon zu profitieren.
Alle werden in den JDK LTS-Versionen 8–21 und den neuesten Versionen vollständig unterstützt, mit umfassender IDE-Unterstützung in IntelliJ IDEA und Android Studio .
Was ist neu...
Typsicheres SQL
Mit Manifold SQL können Sie natives SQL direkt und typsicher in Ihren Java-Code schreiben.
- Abfragetypen sind sofort verfügbar, wenn Sie natives SQL beliebiger Komplexität in Ihren Java-Code eingeben
- Schematypen werden automatisch aus Ihrer Datenbank abgeleitet und bieten typsicheres CRUD, entkoppeltes TX und mehr
- Kein ORM, kein DSL, keine Verkabelung und keine Build-Schritte zur Codegenerierung
Stichprobe von Unternehmen, die Manifold verwenden:
Verwenden Sie das Framework, um direkten, typsicheren Zugriff auf jede Art von Ressource zu erhalten, z. B. SQL , JSON , GraphQL , XML , YAML , CSV und sogar andere Sprachen wie JavaScript . Entfernen Sie den Code-Generierungsschritt in Ihrem Build-Prozess. ▶ Probieren Sie es aus!
SQL: Natives SQL beliebiger Komplexität direkt und typsicher aus Java nutzen.
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: In .graphql-Dateien definierte Typen direkt verwenden, keine Code-Generierungsschritte! Nehmen Sie GraphQL-Änderungen vor und verwenden Sie diese sofort mit Code-Vervollständigung.
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: Verwenden Sie .json-Schemadateien direkt und typsicher, ohne Code-Generierungsschritte! Finden Sie Verwendungsmöglichkeiten von .json-Eigenschaften in Ihrem Java-Code.
// 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 );
Fügen Sie Ihre eigenen Methoden zu vorhandenen Java-Klassen hinzu, sogar String , List und File . Eliminieren Sie den Boilerplate-Code. ▶ Probieren Sie es aus!
String greeting = "hello" ;
greeting . myMethod (); // Add your own methods to String!
Bevorzugen Sie die Zusammensetzung gegenüber der Vererbung. Verwenden Sie @link
und @part
für die automatische Weiterleitung der Schnittstellenimplementierung und echte Delegation.
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 }
Eliminieren Sie Standard-Getter/Setter-Code und verbessern Sie Ihre allgemeine Entwicklungserfahrung mit Eigenschaften.
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
Darüber hinaus leitet die Funktion automatisch Eigenschaften ab, sowohl aus Ihren vorhandenen Quelldateien als auch aus kompilierten Klassen, die Ihr Projekt verwendet. Reduzieren Sie die Immobiliennutzung dadurch:
Actor person = result . getMovie (). getLeadingRole (). getActor ();
Likes likes = person . getLikes ();
likes . setCount ( likes . getCount () + 1 );
dazu:
result . movie . leadingRole . actor . likes . count ++;
Implementieren Sie Operatormethoden für jeden Typ, um arithmetische, relationale, Index- und Einheitenoperatoren direkt zu unterstützen.
// BigDecimal expressions
if ( bigDec1 > bigDec2 ) {
BigDecimal result = bigDec1 + bigDec2 ;
...
}
// Implement operators for any type
MyType value = myType1 + myType2 ;
Tupelausdrücke bieten eine prägnante Syntax zum Gruppieren benannter Datenelemente in einer schlanken Struktur.
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 );
Sie können auch Tupel mit neuer auto
Typinferenz verwenden, um mehrere Rückgabewerte einer Methode zu ermöglichen.
Einheiten- oder Bindungsoperationen gibt es nur im Manifold-Framework. Sie bieten eine äußerst prägnante Syntax und können auf eine Vielzahl von Anwendungen angewendet werden.
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 ;
Arbeiten Sie einfach mit der Range -API mithilfe von Einheitenausdrücken. Importieren Sie einfach die RangeFun- Konstanten, um Bereiche zu erstellen.
// 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 );
}
Nutzen Sie das Manifold-Science-Framework, um Einheiten und präzise Messungen typsicher in Ihre Anwendungen zu integrieren.
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 ;
Verwenden Sie bekannte Direktiven wie #define und #if, um Ihre Java-Projekte bedingt zu kompilieren. Der Präprozessor bietet eine einfache und bequeme Möglichkeit, mehrere Build-Ziele mit einer einzigen Codebasis zu unterstützen. ▶ Probieren Sie es aus!
# if JAVA_8_OR_LATER
@ Override
public void setTime ( LocalDateTime time ) {...}
# else
@ Override
public void setTime ( Calendar time ) {...}
# endif
Vereinheitlichen Sie unterschiedliche APIs. Überbrücken Sie Softwarekomponenten, die Sie nicht kontrollieren. Greifen Sie über typsichere Schnittstellen auf Karten zu. ▶ Probieren Sie es aus!
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"
Greifen Sie mit @Jailbreak auf private Funktionen zu, um die Plackerei und Schwachstelle der Java-Reflexion zu vermeiden. ▶ Probieren Sie es aus!
@ Jailbreak Foo foo = new Foo ();
// Direct, *type-safe* access to *all* foo's members
foo . privateMethod ( x , y , z );
foo . privateField = value ;
Sie haben jetzt die Möglichkeit, aktivierte Ausnahmen so zu gestalten, dass sie sich wie ungeprüfte Ausnahmen verhalten! Kein unbeabsichtigtes Ausnahmeschlucken mehr. Kein Ausprobieren , Fangen , Einwickeln oder erneutes Werfen mehr!
List < String > strings = ...;
List < URL > urls = strings . stream ()
. map ( URL :: new ) // No need to handle the MalformedURLException!
. collect ( Collectors . toList ());
Inline-Variablen und Ausdrücke in String-Literalen, keine umständliche String-Verknüpfung mehr! ▶ Probieren Sie es aus!
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" ;
Erstellen Sie Vorlagendateien mit der vollen Ausdruckskraft von Java und verwenden Sie Ihre Vorlagen direkt in Ihrem Code als Typen. Unterstützt die typsichere Einbindung anderer Vorlagen, gemeinsam genutzter Layouts und mehr. ▶ Probieren Sie es aus!
List < User > users = ...;
String content = abc . example . UserSample . render ( users );
Eine Vorlagendatei 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 >
Verwenden Sie das Manifold-Plugin, um Manifold mit IntelliJ IDEA und Android Studio vollständig zu nutzen. Das Plugin bietet umfassende Unterstützung für Manifold, einschließlich Code-Vervollständigung, Navigation, Verwendungssuche, Refactoring, inkrementelle Kompilierung, Hotswap-Debugging, umfassende Vorlagenbearbeitung, integrierten Präprozessor und mehr.
Holen Sie sich das Plugin vom JetBrains Marketplace
Das Manifold-Projekt besteht aus dem Kern-Manifold-Framework und einer Sammlung von Teilprojekten, die die vom Kern-Framework bereitgestellten SPIs implementieren. Jedes Projekt besteht aus einer oder mehreren Abhängigkeiten , die Sie ganz einfach zu Ihrem Projekt hinzufügen können:
Verteiler: Kern
Verteiler: Erweiterungen
Verteiler: Delegation
Verteiler: Eigenschaften
Mannigfaltigkeit: Tupel
Verteiler: SQL
Mannigfaltigkeit: GraphQL
Verteiler: JSON
Verteiler: XML
Verteiler: YAML
Verteiler: CSV
Verteiler: Eigenschaftsdateien
Verteiler: Bild
Mannigfaltigkeit: Dunkles Java
Verteiler: JavaScript
Manifold: Java-Vorlagen
Mannigfaltigkeit: String-Interpolation
Verteiler: (Un)geprüfte Ausnahmen
Verteiler: Präprozessor
Vielfältigkeit: Wissenschaft
Verteiler: Sammlungen
Verteiler: I/0
Verteiler: Text
Experimentieren Sie mit Beispielprojekten:
- Verteiler: Beispiel-App
- Manifold: Beispiel-SQL-App
- Manifold: Beispiel-GraphQL-App
- Manifold: Beispiel-REST-API-App
- Manifold: Beispiel-Web-App
- Verteiler: Gradle-Beispielprojekt
- Verteiler: Beispiel einer Kotlin-App
Verteiler unterstützt:
Umfassende IDE-Unterstützung ist auch für IntelliJ IDEA und Android Studio verfügbar.
Treten Sie unserem Discord-Server bei, um eine Diskussion zu starten, Fragen zu stellen, Feedback zu geben usw. Normalerweise ist jemand da, der Ihnen hilft.