Manifold adalah plugin kompiler Java. Gunakan untuk melengkapi proyek Java Anda dengan fitur yang sangat produktif.
Tipe metaprogramming waktu kompilasi tingkat lanjut-dengan aman mengintegrasikan segala jenis data, metadata, atau DSL langsung ke Java.
Peningkatan bahasa yang kuat secara signifikan meningkatkan produktivitas pengembang.
Setiap fitur tersedia sebagai ketergantungan terpisah. Cukup tambahkan dependensi Manifold pilihan Anda ke proyek yang ada dan mulailah memanfaatkannya.
Semua didukung penuh di JDK LTS rilis 8 - 21+ terbaru dengan dukungan IDE komprehensif di IntelliJ IDEA dan Android Studio .
Apa yang Baru...
SQL yang aman untuk mengetik
Manifold SQL memungkinkan Anda menulis SQL asli secara langsung dan mengetik dengan aman di kode Java Anda.
- Tipe kueri langsung tersedia saat Anda mengetikkan SQL asli dengan kompleksitas apa pun dalam kode Java Anda
- Tipe skema secara otomatis diturunkan dari database Anda, menyediakan CRUD yang aman untuk tipe, TX yang dipisahkan, dan banyak lagi
- Tanpa ORM, Tanpa DSL, Tanpa kabel, dan Tanpa langkah pembuatan pembuatan kode
Pengambilan sampel perusahaan yang menggunakan Manifold:
Gunakan kerangka kerja untuk mendapatkan akses langsung dan aman terhadap jenis sumber daya apa pun , seperti SQL , JSON , GraphQL , XML , YAML , CSV , dan bahkan bahasa lain seperti JavaScript . Hapus langkah pembuatan kode dalam proses pembuatan Anda. ▶ Coba lihat!
SQL: Gunakan SQL asli dengan kompleksitas apa pun secara langsung dan mengetik dengan aman dari 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: Gunakan tipe yang ditentukan dalam file .graphql secara langsung , tanpa langkah pembuatan kode! Buat perubahan GraphQL dan segera gunakan dengan penyelesaian kode.
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: Gunakan file skema .json secara langsung dan ketik dengan aman, tanpa langkah pembuatan kode! Temukan penggunaan properti .json dalam kode Java Anda.
// 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 );
Tambahkan metode Anda sendiri ke kelas Java yang ada, bahkan String , List , dan File . Hilangkan kode boilerplate. ▶ Coba lihat!
String greeting = "hello" ;
greeting . myMethod (); // Add your own methods to String!
Lebih menyukai komposisi daripada warisan. Gunakan @link
dan @part
untuk penerusan implementasi antarmuka otomatis dan delegasi sebenarnya .
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 }
Hilangkan kode pengambil/penyetel boilerplate, tingkatkan pengalaman pengembangan Anda secara keseluruhan dengan properti.
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
Selain itu, fitur ini secara otomatis menyimpulkan properti, baik dari file sumber yang ada maupun dari kelas terkompilasi yang digunakan proyek Anda. Kurangi penggunaan properti dari ini:
Actor person = result . getMovie (). getLeadingRole (). getActor ();
Likes likes = person . getLikes ();
likes . setCount ( likes . getCount () + 1 );
untuk ini:
result . movie . leadingRole . actor . likes . count ++;
Menerapkan metode operator pada jenis apa pun untuk secara langsung mendukung operator aritmatika, relasional, indeks, dan unit.
// BigDecimal expressions
if ( bigDec1 > bigDec2 ) {
BigDecimal result = bigDec1 + bigDec2 ;
...
}
// Implement operators for any type
MyType value = myType1 + myType2 ;
Ekspresi tuple menyediakan sintaksis ringkas untuk mengelompokkan item data bernama dalam struktur ringan.
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 );
Anda juga dapat menggunakan tupel dengan inferensi tipe auto
baru untuk mengaktifkan beberapa nilai kembalian dari suatu metode.
Operasi unit atau pengikatan bersifat unik pada kerangka Manifold. Mereka menyediakan sintaks yang sangat ringkas dan dapat diterapkan pada berbagai aplikasi.
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 ;
Bekerja dengan mudah dengan Range API menggunakan ekspresi unit. Cukup impor konstanta RangeFun untuk membuat rentang.
// 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 );
}
Gunakan kerangka kerja berbagai ilmu untuk menggabungkan satuan dan pengukuran presisi dengan aman ke dalam aplikasi Anda.
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 ;
Gunakan arahan yang familiar seperti #define dan #if untuk mengkompilasi proyek Java Anda secara kondisional. Praprosesor menawarkan cara sederhana dan nyaman untuk mendukung beberapa target pembangunan dengan satu basis kode. ▶ Coba lihat!
# if JAVA_8_OR_LATER
@ Override
public void setTime ( LocalDateTime time ) {...}
# else
@ Override
public void setTime ( Calendar time ) {...}
# endif
Satukan API yang berbeda. Jembatani komponen perangkat lunak yang tidak Anda kendalikan. Akses peta melalui antarmuka yang aman untuk tipe. ▶ Coba lihat!
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"
Akses fitur pribadi dengan @Jailbreak untuk menghindari kerumitan dan kerentanan refleksi Java. ▶ Coba lihat!
@ Jailbreak Foo foo = new Foo ();
// Direct, *type-safe* access to *all* foo's members
foo . privateMethod ( x , y , z );
foo . privateField = value ;
Anda sekarang memiliki opsi untuk membuat pengecualian yang dicentang berperilaku seperti pengecualian yang tidak dicentang! Tidak ada lagi pengecualian yang tidak disengaja jika tertelan. Tidak perlu lagi mencoba / menangkap / membungkus / melempar kembali boilerplate!
List < String > strings = ...;
List < URL > urls = strings . stream ()
. map ( URL :: new ) // No need to handle the MalformedURLException!
. collect ( Collectors . toList ());
Variabel dan ekspresi sebaris dalam literal String, tidak ada lagi rangkaian string yang kikuk! ▶ Lihatlah!
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" ;
Penulis file template dengan kekuatan ekspresif penuh Java, gunakan template Anda langsung di kode Anda sebagai tipe. Mendukung penyertaan template lain, tata letak bersama, dan banyak lagi yang aman untuk mengetik. ▶ Lihatlah!
List < User > users = ...;
String content = abc . example . UserSample . render ( users );
File templat 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 >
Gunakan plugin Manifold untuk memanfaatkan Manifold sepenuhnya dengan IntelliJ IDEA dan Android Studio . Plugin ini memberikan dukungan komprehensif untuk Manifold termasuk penyelesaian kode, navigasi, pencarian penggunaan, pemfaktoran ulang, kompilasi tambahan, debugging hotswap, pengeditan template berfitur lengkap, praprosesor terintegrasi, dan banyak lagi.
Dapatkan plugin dari JetBrains Marketplace
Proyek Manifold terdiri dari kerangka Manifold inti dan kumpulan sub-proyek yang mengimplementasikan SPI yang disediakan oleh kerangka inti. Setiap proyek terdiri dari satu atau lebih dependensi yang dapat Anda tambahkan dengan mudah ke proyek Anda:
Berjenis: Inti
Berjenis : Ekstensi
Manifold : Delegasi
Berjenis : Properti
Manifold : Tupel
Berjenis: SQL
Berjenis : GraphQL
Berjenis: JSON
Berjenis: XML
Berjenis: YAML
Berjenis: CSV
Manifold : File Properti
Berjenis : Gambar
Manifold : Jawa Gelap
Berjenis: JavaScript
Berjenis: Templat Java
Manifold : Interpolasi String
Manifold : (Tidak) dicentang Pengecualian
Manifold : Praprosesor
Berjenis : Sains
Berjenis : Koleksi
Berjenis : I/0
Berjenis : Teks
Bereksperimenlah dengan proyek sampel:
- Manifold: Contoh Aplikasi
- Manifold : Contoh Aplikasi SQL
- Manifold : Contoh Aplikasi GraphQL
- Manifold : Contoh Aplikasi REST API
- Manifold : Contoh Aplikasi Web
- Manifold : Proyek Contoh Gradle
- Manifold : Contoh Aplikasi Kotlin
Dukungan berjenis:
Dukungan IDE yang komprehensif juga tersedia untuk IntelliJ IDEA dan Android Studio.
Bergabunglah dengan server Discord kami untuk memulai diskusi, mengajukan pertanyaan, memberikan umpan balik, dll. Biasanya ada seseorang yang siap membantu.