今天我們來討論 Kotlin 最常一起討論比較的語言:Java。
Java 作為一個歷史悠久的語言,能夠應用的範圍也非常的廣,後端開發自然也是其中的一個應用範圍。
Kotlin 當初在設計時,作為一個同樣可以被編譯為 Java Bytecode 並在 JVM 上面運行的語言,Kotlin 選擇了在語法設計上,可以和過去 Java 撰寫的套件或框架能有良好的互動。兩個語言交互作用的程度,甚至可以在同一個專案裡面同時包含兩種語言,並進行編譯。
這也讓在討論後端開發的比較時,狀況會變得比較多元一點。
下面盡可能地針對我所知道的各種狀況進行討論
討論 Java 的後端開發,一定會討論到目前使用率最高的框架 Spring Boot
只要單純的一點 Java Code,就可以快速的建立一個後端 API Server
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
return String.format("Hello %s!", name);
}
}
並且 Spring Boot 有自己的 ORM 結構和依賴注入,不用像 Ktor 一樣引入許多套件,可以說是一個非常完整的框架。
隨著 Kotlin 的使用者越來越多,Spring Boot 也慢慢的接受使用 Kotlin 開發這個可能
甚至在官網上加入了使用 Kotlin 建置的選項。
所以使用 Kotlin 開發 Spring Boot 專案,已經是一個可參考的選項。
程式碼大概是這個樣子
package com.example.blog
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping
@Controller
class HtmlController {
@GetMapping("/")
fun blog(model: Model): String {
model["title"] = "Blog"
return "blog"
}
}
可以看出,雖然是不同的程式語言,但是結構還是很明顯是 spring boot 的樣子
雖然技術上可行,但是在一個專案內混用兩種語言,對許多開發者來說還是挺衝擊的。可以想到會有很多人員的磨合和程式交互的問題存在。
既然如此,為什麼還要參考這個選項呢?
因為,雖然使用 Java 在技術上能做到所有 Kotlin 能做到的事情,但是語法實在是太繁瑣了。
舉例來說,同樣是一個 JPA 的 Entity,用 Java 寫起來會是
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
// 預設建構子 (JPA 需要)
public User() {}
public User(String username, String email) {
this.username = username;
this.email = email;
}
// Getter 和 Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
一樣的概念,用 Kotlin 寫起來則是
import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
@Entity
data class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
var username: String,
var email: String
)
可以明顯看出,整個程式碼簡潔了不少。
這也是讓許多工程師在看到中大型且時常需要更改的專案時,會有將專案慢慢改成 Kotlin 的想法,起碼每天要閱讀的程式碼份量不會那麼高。
今天的部分就討論到這邊,我們明天見!