java groovy kotlin 三者的比较
| 特性 | Java | Groovy | Kotlin |
|---|---|---|---|
| 类型系统 | 强静态类型 | 动态类型(默认),可选静态 | 静态类型,有类型推断 |
| 语法简洁性 | 冗长 | 非常简洁 | 简洁 |
| 空安全 | 无 | 无 | 有(null安全内置) |
| 函数式编程 | 有限支持(Java 8+) | 良好支持 | 良好支持 |
| 脚本能力 | 无 | 有 | 有限支持 |
| 编译速度 | 快 | 慢 | 中等 |
| 扩展方法 | 无 | 有 | 有 |
| DSL支持 | 弱 | 优秀 | 良好 |
| 协程 | 无 | 有 | 有 |
| 默认修饰符 | package-private | public | public |
| 主要用途 | 企业应用, Android | 脚本, 测试, DSL | Android, 全栈 |
入门示例
Hello World
java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}groovy
println 'Hello, World!'kotlin
fun main() {
println("Hello, World!")
}基础工程搭建
shell
## 使用maven搭建
mvn archetype:generate -DgroupId=com.example -DartifactId=java-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
## 使用gradle搭建
gradle init --type java-applicationshell
## 使用maven搭建
mvn archetype:generate -DgroupId=com.example -DartifactId=groovy-demo -DarchetypeArtifactId=groovy-maven-archetype -DinteractiveMode=false
## 使用gradle搭建
gradle init --type groovy-applicationshell
## 使用maven搭建
mvn archetype:generate -DgroupId=com.example -DartifactId=kotlin-demo -DarchetypeArtifactId=kotlin-archetype-jvm -DinteractiveMode=false
## 使用gradle搭建
gradle init --type kotlin-application混合项目搭建
目录结构
text
project-root/
├── build.gradle
├── settings.gradle
├── src/
│ ├── main/
│ │ ├── java/ # Java 源代码
│ │ ├── groovy/ # Groovy 源代码
│ │ ├── kotlin/ # Kotlin 源代码
│ │ └── resources/ # 资源文件
│ └── test/
│ ├── java/ # Java 测试代码
│ ├── groovy/ # Groovy 测试代码
│ ├── kotlin/ # Kotlin 测试代码
│ └── resources/ # 测试资源文件
└── build/ # 构建输出目录build.gradle
groovy
plugins {
id 'java'
id 'groovy' // Groovy 应该在 Java 之后
id 'org.jetbrains.kotlin.jvm' version '1.8.0' // Kotlin 应该在 Java 之后
}
repositories {
mavenCentral()
}
dependencies {
// Java 依赖
implementation 'com.google.guava:guava:31.1-jre'
// Groovy 依赖
implementation 'org.codehaus.groovy:groovy-all:3.0.13'
// Kotlin 依赖
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
// 测试依赖
testImplementation 'junit:junit:4.13.2'
}
// 设置源代码目录
sourceSets {
main {
java { srcDirs = ['src/main/java'] }
groovy { srcDirs = ['src/main/groovy'] }
kotlin { srcDirs = ['src/main/kotlin'] }
resources { srcDirs = ['src/main/resources'] }
}
test {
java { srcDirs = ['src/test/java'] }
groovy { srcDirs = ['src/test/groovy'] }
kotlin { srcDirs = ['src/test/kotlin'] }
resources { srcDirs = ['src/test/resources'] }
}
}
tasks.withType(JavaCompile).configureEach {
sourceCompatibility = '17'
targetCompatibility = '17'
}
compileKotlin {
kotlinOptions.jvmTarget = "17"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "17"
}
compileGroovy {
targetCompatibility = '17'
}