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: 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"
Java 리플렉션의 고된 작업과 취약성을 방지하려면 @Jailbreak를 사용하여 비공개 기능에 액세스하세요. ▶ 확인해보세요!
@ 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 >
IntelliJ IDEA 및 Android Studio 에서 Manifold를 완벽하게 활용하려면 Manifold 플러그인을 사용하세요. 플러그인은 코드 완성, 탐색, 사용법 검색, 리팩토링, 증분 컴파일, 핫스왑 디버깅, 모든 기능을 갖춘 템플릿 편집, 통합 전처리기 등을 포함하여 Manifold에 대한 포괄적인 지원을 제공합니다.
JetBrains Marketplace에서 플러그인 다운로드
Manifold 프로젝트는 핵심 Manifold 프레임워크와 핵심 프레임워크에서 제공하는 SPI를 구현하는 하위 프로젝트 모음으로 구성됩니다. 각 프로젝트는 프로젝트에 쉽게 추가할 수 있는 하나 이상의 종속성 으로 구성됩니다.
매니폴드 : 코어
매니폴드: 확장
매니폴드 : 위임
매니폴드 : 속성
매니폴드: 튜플
매니폴드 : SQL
매니폴드 : GraphQL
매니폴드 : JSON
매니폴드: XML
매니폴드: YAML
매니폴드 : CSV
매니폴드: 속성 파일
매니폴드 : 이미지
매니폴드 : 다크 자바
매니폴드 : 자바스크립트
매니폴드: Java 템플릿
Manifold : 문자열 보간
매니폴드: (Un)체크된 예외
매니폴드 : 전처리기
매니폴드 : 과학
매니폴드: 컬렉션
매니폴드 : I/0
매니폴드 : 텍스트
샘플 프로젝트로 실험해 보세요.
- 매니폴드: 샘플 앱
- 매니폴드: 샘플 SQL 앱
- 매니폴드: 샘플 GraphQL 앱
- 매니폴드: 샘플 REST API 앱
- 매니폴드: 샘플 웹 앱
- Manifold : Gradle 예제 프로젝트
- 매니폴드: 샘플 Kotlin 앱
매니폴드는 다음을 지원합니다.
IntelliJ IDEA 및 Android Studio에 대한 포괄적인 IDE 지원도 제공됩니다.
Discord 서버에 가입하여 토론을 시작하고, 질문하고, 피드백을 제공하는 등의 작업을 수행하세요. 일반적으로 누군가가 도움을 드립니다.