CodeGentle 提供了一套全面的规范(Spec)类,用于生成 Java 和 Kotlin 源代码。本文档涵盖了三个主要模块中所有 XxxSpec 类的使用方法和构造模式:codegentle-common、codegentle-java 和 codegentle-kotlin。
- 类型规范 - 类、接口、枚举、对象、记录
- 成员规范 - 方法、函数、属性、字段、构造函数
- 参数规范 - 方法/函数参数和类型参数
CodeGentle 规范类在所有模块中遵循一致的设计模式:
- 基于接口的设计:每个 Spec 都定义为具有特定属性的密封接口
- 构建器模式:伴生对象提供构造的构建器方法
- DSL 扩展:内联函数启用流畅的、基于 lambda 的配置
- 收集器模式:构建器扩展多个收集器接口以实现流畅的 API
import love.forte.codegentle.java.spec.*
import love.forte.codegentle.java.JavaFile
import love.forte.codegentle.common.naming.parseToPackageName
// 使用 DSL 创建简单的 Java 类
val javaClass = JavaSimpleTypeSpec(JavaTypeSpec.Kind.CLASS, "HelloWorld") {
addModifier(JavaModifier.PUBLIC)
addDoc("一个简单的问候类。")
addMethod(JavaMethodSpec("greet") {
addModifier(JavaModifier.PUBLIC)
returns(JavaClassNames.STRING.ref())
addParameter(JavaParameterSpec("name", JavaClassNames.STRING.ref()))
addCode("return \"Hello, \" + name + \"!\";")
})
}
// 创建包含该类的 Java 文件
val javaFile = JavaFile("com.example".parseToPackageName()) {
addType(javaClass)
}import love.forte.codegentle.kotlin.spec.*
import love.forte.codegentle.kotlin.KotlinFile
import love.forte.codegentle.common.naming.parseToPackageName
// 使用 DSL 创建简单的 Kotlin 类
val kotlinClass = KotlinSimpleTypeSpec(KotlinTypeSpec.Kind.CLASS, "HelloWorld") {
addModifier(KotlinModifier.DATA)
addKdoc("一个简单的问候类。")
primaryConstructor {
addParameter("name", KotlinClassNames.STRING)
}
addFunction(KotlinFunctionSpec("greet") {
returns(KotlinClassNames.STRING)
addCode("return \"Hello, \$name!\"")
})
}
// 创建包含该类的 Kotlin 文件
val kotlinFile = KotlinFile("com.example".parseToPackageName()) {
addType(kotlinClass)
}CodeGentle 提供两种主要的构造 Spec 实例的方法:
// Java 示例
val methodSpec = JavaMethodSpec.methodBuilder("calculate")
.addModifier(JavaModifier.PUBLIC)
.returns(JavaClassNames.INT.ref())
.addParameter(JavaParameterSpec("a", JavaClassNames.INT.ref()))
.addParameter(JavaParameterSpec("b", JavaClassNames.INT.ref()))
.addCode("return a + b;")
.build()// Java 示例 - 与上面相同的结果但更简洁
val methodSpec = JavaMethodSpec("calculate") {
addModifier(JavaModifier.PUBLIC)
returns(JavaClassNames.INT.ref())
addParameter(JavaParameterSpec("a", JavaClassNames.INT.ref()))
addParameter(JavaParameterSpec("b", JavaClassNames.INT.ref()))
addCode("return a + b;")
}DSL 优势:
- 更简洁易读
- 更好的 IDE 支持与上下文补全
- 更容易嵌套和组合
- 遵循 Kotlin 习惯用法
- 静态块和静态成员
- 方法签名中的受检异常
- 记录类型和密封类(Java 14+)
- 带默认值的注解类型
- 包私有可见性
- 主构造函数和副构造函数
- 属性访问器(getter/setter)
- 扩展函数和属性
- 上下文接收器和挂起函数
- 值类和内联类
- 伴生对象和对象声明