Manifold は Java コンパイラ プラグインです。これを使用して、Java プロジェクトを生産性の高い機能で補完します。
高度なコンパイル時メタプログラミングにより、あらゆる種類のデータ、メタデータ、DSL を直接 Java にタイプセーフに統合できます。
強力な言語の機能強化により、開発者の生産性が大幅に向上します。
各機能は個別の依存関係として利用できます。選択した Manifold の依存関係を既存のプロジェクトに追加するだけで、それらの利用を開始できます。
すべては、 IntelliJ IDEAおよびAndroid Studioでの包括的な IDE サポートを備えた JDK LTS リリース 8 ~ 21 + 最新で完全にサポートされています。
新着情報...
タイプセーフな SQL
Manifold SQL を使用すると、Java コード内でネイティブ SQL を直接、タイプセーフに作成できます。
- Java コードに複雑なネイティブ SQL を入力すると、クエリ タイプがすぐに利用可能になります。
- スキーマ タイプはデータベースから自動的に導出され、タイプ セーフな CRUD、分離された TX などを提供します。
- ORM なし、DSL なし、配線なし、コード生成のビルド ステップなし
Manifold を使用している企業のサンプリング:
このフレームワークを使用すると、 SQL 、 JSON 、 GraphQL 、 XML 、 YAML 、 CSV 、さらにはJavaScriptなどの他の言語など、あらゆるタイプのリソースに直接、タイプセーフにアクセスできます。ビルド プロセスからコード生成ステップを削除します。 ▶ぜひチェックしてみてください!
SQL:複雑なネイティブSQL を 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: .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 );
String 、 List 、 Fileなどの独自のメソッドを既存の Java クラスに追加します。定型コードを削除します。 ▶ぜひチェックしてみてください!
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 }
ボイラープレートのゲッター/セッター コードを排除し、プロパティに関する全体的な開発エクスペリエンスを向上させます。
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 プラグインを使用して、 IntelliJ IDEAおよびAndroid Studioで Manifold を最大限に活用します。このプラグインは、コード補完、ナビゲーション、使用法の検索、リファクタリング、インクリメンタル コンパイル、ホットスワップ デバッグ、フル機能のテンプレート編集、統合プリプロセッサなどを含む Manifold の包括的なサポートを提供します。
JetBrains Marketplace からプラグインを入手します
Manifold プロジェクトは、コア Manifold フレームワークと、コア フレームワークによって提供される SPI を実装するサブプロジェクトのコレクションで構成されます。各プロジェクトは、プロジェクトに簡単に追加できる 1 つ以上の依存関係で構成されています。
マニホールド:コア
マニホールド :拡張
マニホールド :委任
マニホールド :プロパティ
多様体 :タプル
多様体 : SQL
マニホールド : GraphQL
マニホールド : JSON
マニホールド : XML
マニホールド : YAML
マニホールド: CSV
マニホールド :プロパティ ファイル
マニホールド:イメージ
マニホールド :ダーク Java
マニホールド : JavaScript
マニホールド : Java テンプレート
多様体 :文字列補間
マニホールド : (未)チェック済みの例外
マニホールド :プリプロセッサ
多様体 :科学
マニホールド :コレクション
マニホールド: I/0
マニホールド :テキスト
サンプル プロジェクトを試してみましょう。
- マニホールド :サンプルアプリ
- マニホールド :サンプル SQL アプリ
- マニホールド :サンプル GraphQL アプリ
- マニホールド :サンプル REST API アプリ
- マニホールド :サンプル Web アプリ
- マニホールド : Gradle サンプル プロジェクト
- マニホールド :サンプル Kotlin アプリ
マニホールドは以下をサポートします。
包括的な IDE サポートは、IntelliJ IDEA および Android Studio でも利用できます。
Discord サーバーに参加して、ディスカッションを開始したり、質問したり、フィードバックを提供したりできます。通常は誰かが助けてくれます。