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 服务器来开始讨论、提出问题、提供反馈等。通常会有人提供帮助。