Manifold 是一個 Java 編譯器插件。用它來補充您的 Java 專案的高效功能。
進階編譯時元程式設計類型安全地將任何類型的資料、元資料或 DSL 直接整合到 Java 中。
強大的語言增強功能顯著提高了開發人員的工作效率。
每個功能都可以作為單獨的依賴項使用。只需將您選擇的 Manifold 依賴項新增至現有專案並開始利用它們即可。
JDK LTS 版本 8 - 21 + 最新版完全支援所有這些,並在IntelliJ IDEA和Android Studio中提供全面的 IDE 支援。
什麼是新的...
類型安全的 SQL
Manifold SQL 可讓您在 Java 程式碼中直接編寫類型安全的本機 SQL。
- 當您在 Java 程式碼中鍵入任意複雜的本機 SQL 時,查詢類型立即可用
- 模式類型會自動從您的資料庫派生,提供類型安全的 CRUD、解耦 TX 等
- 無 ORM、無 DSL、無佈線、無程式碼產生建置步驟
使用 Manifold 的公司抽樣:
使用該框架可以直接、類型安全地存取任何類型的資源,例如SQL 、 JSON 、 GraphQL 、 XML 、 YAML 、 CSV ,甚至其他語言(例如JavaScript ) 。刪除建置過程中的程式碼產生步驟。 ▶看看吧!
SQL:直接從 Java以型別安全的方式使用任何複雜性的本機SQL。
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:直接使用 .graphql 檔案中定義的類型,無需程式碼產生步驟!進行 GraphQL 更改並立即透過程式碼完成來使用它們。
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:直接使用 .json 架構檔案且類型安全,無需程式碼產生步驟!尋找 Java 程式碼中 .json 屬性的用法。
// 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 );
將您自己的方法加入現有的 Java 類別中,甚至是String 、 List和File 。消除樣板代碼。 ▶看看吧!
String greeting = "hello" ;
greeting . myMethod (); // Add your own methods to String!
優先考慮組合而不是繼承。使用@link
和@part
進行自動介面實現轉送和真正的委託。
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 }
消除樣板 getter/setter 程式碼,改善屬性的整體開發體驗。
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
此外,此功能會自動從現有原始檔案和專案使用的編譯類別推斷屬性。由此減少財產使用:
Actor person = result . getMovie (). getLeadingRole (). getActor ();
Likes likes = person . getLikes ();
likes . setCount ( likes . getCount () + 1 );
對此:
result . movie . leadingRole . actor . likes . count ++;
在任何類型上實現運算符方法以直接支援算術、關係、索引和單位運算符。
// BigDecimal expressions
if ( bigDec1 > bigDec2 ) {
BigDecimal result = bigDec1 + bigDec2 ;
...
}
// Implement operators for any type
MyType value = myType1 + myType2 ;
元組表達式提供簡潔的語法,以輕量級結構將命名資料項分組。
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 );
您也可以使用具有新auto
類型推斷的元組來啟用方法的多個回傳值。
單元或綁定操作是 Manifold 框架所獨有的。它們提供了強大而簡潔的語法,並且可以應用於廣泛的應用程式。
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 ;
使用單位表達式輕鬆使用Range API。只需導入RangeFun常數即可建立範圍。
// 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 );
}
使用流形科學框架將單位和精確測量安全地輸入到您的應用程式中。
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 ;
使用#define和#if等熟悉的指令來有條件地編譯 Java 專案。預處理器提供了一種簡單方便的方法來使用單一程式碼庫支援多個建置目標。 ▶看看吧!
# if JAVA_8_OR_LATER
@ Override
public void setTime ( LocalDateTime time ) {...}
# else
@ Override
public void setTime ( Calendar time ) {...}
# endif
統一不同的 API。橋接您無法控制的軟體元件。透過類型安全介面存取映射。 ▶看看吧!
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"
使用@Jailbreak存取私有功能,以避免 Java 反射的苦差事和漏洞。 ▶看看吧!
@ Jailbreak Foo foo = new Foo ();
// Direct, *type-safe* access to *all* foo's members
foo . privateMethod ( x , y , z );
foo . privateField = value ;
現在您可以選擇使已檢查的異常表現得像未檢查的異常!不再有意外的異常吞嚥。不再需要嘗試/捕獲/包裝/重新拋出樣板!
List < String > strings = ...;
List < URL > urls = strings . stream ()
. map ( URL :: new ) // No need to handle the MalformedURLException!
. collect ( Collectors . toList ());
字串文字中的內聯變數和表達式,不再有笨重的字串連接! ▶看看吧!
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" ;
使用 Java 的完整表達能力編寫模板文件,直接在程式碼中使用模板作為類型。支援類型安全地包含其他模板、共享佈局等。 ▶看看吧!
List < User > users = ...;
String content = abc . example . UserSample . render ( users );
範本檔案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 >
使用 Manifold 插件可以充分利用 Manifold 與IntelliJ IDEA和Android Studio 。該插件為 Manifold 提供全面的支持,包括程式碼補全、導航、用法搜尋、重構、增量編譯、熱插拔除錯、全功能模板編輯、整合預處理器等。
從 JetBrains Marketplace 取得插件
Manifold 專案由核心 Manifold 框架和實作核心框架提供的 SPI 的子專案集合組成。每個項目都包含一個或多個依賴項,您可以輕鬆新增到專案中:
歧管:核心
歧管:擴展
流形:代表團
流形:屬性
流形:元組
流形: SQL
流形: GraphQL
流形: JSON
流形: XML
流形: YAML
歧管: CSV
歧管:屬性文件
流形:影像
流形: Dark Java
流形: JavaScript
流形: Java 模板
流形:字串插值
流形:(未)檢查異常
流形:預處理器
流形:科學
流形:集合
流形: I/0
流形:文字
嘗試範例項目:
- Manifold:範例應用程式
- Manifold:範例 SQL 應用程式
- Manifold:範例 GraphQL 應用程式
- Manifold:範例 REST API 應用程式
- Manifold:範例 Web 應用程式
- Manifold: Gradle 範例項目
- Manifold:範例 Kotlin 應用程式
歧管支援:
IntelliJ IDEA 和 Android Studio 也提供全面的 IDE 支援。
加入我們的 Discord 伺服器來開始討論、提出問題、提供回饋等 通常會有人提供協助。