前言
我曾經是一名 .Net 開發,如今的我是一名 Java 開發者。在我享受着 Java 成熟的生態時,我常常懷念 c# 簡潔的語法:自動屬性、類型推斷、自動初始化器 ....
魚,我所欲也,熊掌亦我所欲也; 二者不可得兼;
直到我遇到了 lombok 。
添加依賴及 IDE 插件
maven 添加依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven</artifactId>
<version>1.16.14.0</version>
</dependency>
因為 lombok 要在編譯器編譯時通過操作AST(抽象語法樹)改變字節碼生成,因此為了讓 IDE 能夠支持 lombok 需要給 IDE 添加相關插件,下面是 Idea 添加插件的方法:


使用
"Java的自動屬性" -- @Getter & @Setter
Java 程序員在項目中不可避免的需要創建大量的 POJO , 在 POJO 中代碼行數最多的就是我們不關心的 Getter 和 Setter 方法。雖然 IDE 可以幫助我們生成代碼,但是冗長的代碼看着還是很不爽。
看看 lombok 如何幫助我們簡化代碼:
public class User {
@Getter
@Setter
private String name;
@Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED)
private Integer age;
}
@Getter & @Setter 可以注解在類和屬性上,放在類上,會對所有的非靜態屬性生成Getter&Setter方法,注解在屬性上,會對該屬性生成Getter&Setter方法。
並可以通過AccessLevel來設置Getter&Setter方法的訪問級別。
"Java的類型推斷" -- @val
很奇怪為什么 lombok 使用 val 而不是 跟 c# 一樣使用 var ?因為 lombok 認為 java 后期可能會增加 var 這個關鍵字來支持類型推斷,事實卻是....
@Test
public void valTest() {
val user = getUser();
user.setName("javaNoob");
System.out.println(user.getName());
}
private User getUser(){
return new User();
}
沒有"自動初始化器"的 java ,只能用構造函數 -- @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class User {
@Getter
@Setter
private String name;
@Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED)
private Integer age;
}
顧名思義:NoArgsConstructor 生成無參數構造函數,AllArgsConstructor 生成全部參數構造函數,RequiredArgsConstructor生成@NonNull注解字段的構造函數。
@NonNull 自動生成非空檢查
對於 NullPointerException 異常 java 程序員應該再熟悉不過,@NonNull 注解就是幫我們生成Null檢查。
@NonNull
private String name;
@Test
public void valTest() {
val user = getUser();
user.setName(null);
System.out.println(user.getName());
}
/**
java.lang.NullPointerException: name
at com.github.javanoob.lombok.User.setName(User.java:11)
*/
相當於
private void setName(String name) {
if (name==null){
throw new NullPointerException("name");
}
}
@Synchronized 將方法變成同步方法
@Synchronized
private void syncMethod(){
System.out.println("I am synchronized");
}
相當於
private static final Object $LOCK = new Object[0] ;
private void syncMethod(){
synchronized($LOCK) {
System.out.println("I am synchronized");
}
}
其他
@ToString 生成toString方法;@EqualsAndHashCode 幫你生成 equal()和 hashCode()方法。@Log 幫你生成日志相關代碼。
也有一些比較雞肋的 @Cleanup 感覺完全可以使用try-with-resource 來代替,還有 @SneakyThrows 個人感覺沒什么使用場景。
總結
不知何時寫 Java代碼可以像C#一樣爽
