前言

我曾經(jīng)是一名 .Net 開發(fā),如今的我是一名 Java 開發(fā)者。在我享受著 Java 成熟的生態(tài)時,我常常懷念 c# 簡潔的語法:自動屬性、類型推斷、自動初始化器 ....

魚,我所欲也,熊掌亦我所欲也; 二者不可得兼;

直到我遇到了 lombok 。

添加依賴及 IDE 插件

maven 添加依賴:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven</artifactId>
    <version>1.16.14.0</version></dependency>

因為 lombok 要在編譯器編譯時通過操作AST(抽象語法樹)改變字節(jié)碼生成,因此為了讓 IDE 能夠支持 lombok 需要給 IDE 添加相關(guān)插件,下面是 Idea 添加插件的方法:
photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

使用

"Java的自動屬性" -- @Getter & @Setter

Java 程序員在項目中不可避免的需要創(chuàng)建大量的 POJO , 在 POJO 中代碼行數(shù)最多的就是我們不關(guān)心的 Getter 和 Setter 方法。雖然 IDE 可以幫助我們生成代碼,但是冗長的代碼看著還是很不爽。
看看 lombok 如何幫助我們簡化代碼:

public class User {    @Getter
    @Setter
    private String name;    @Getter(AccessLevel.PROTECTED)    @Setter(AccessLevel.PROTECTED)    private Integer age;
}

@Getter & @Setter 可以注解在類和屬性上,放在類上,會對所有的非靜態(tài)屬性生成Getter&Setter方法,注解在屬性上,會對該屬性生成Getter&Setter方法。

并可以通過AccessLevel來設(shè)置Getter&Setter方法的訪問級別。

"Java的類型推斷" -- @val

很奇怪為什么 lombok 使用 val 而不是 跟 c# 一樣使用 var ?因為 lombok 認(rèn)為 java 后期可能會增加 var 這個關(guān)鍵字來支持類型推斷,事實卻是....

   @Test
    public void valTest() {
        val user = getUser();
        user.setName("javaNoob");
        System.out.println(user.getName());
    }    private User getUser(){        return  new User();
    }

沒有"自動初始化器"的 java ,只能用構(gòu)造函數(shù) -- @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

@NoArgsConstructor@AllArgsConstructor@RequiredArgsConstructorpublic class User {    @Getter
    @Setter
    private String name;    @Getter(AccessLevel.PROTECTED)    @Setter(AccessLevel.PROTECTED)    private Integer age;
}

顧名思義:NoArgsConstructor 生成無參數(shù)構(gòu)造函數(shù),AllArgsConstructor 生成全部參數(shù)構(gòu)造函數(shù),RequiredArgsConstructor生成@NonNull注解字段的構(gòu)造函數(shù)。

@NonNull 自動生成非空檢查

對于 NullPointerException 異常 java 程序員應(yīng)該再熟悉不過,@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)    */

相當(dāng)于

    private void setName(String name) {        if (name==null){         throw new NullPointerException("name");  
        }
    }

@Synchronized 將方法變成同步方法

    @Synchronized
    private void syncMethod(){
        System.out.println("I am synchronized");
    }

相當(dāng)于

    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 幫你生成日志相關(guān)代碼。

也有一些比較雞肋的 @Cleanup 感覺完全可以使用try-with-resource 來代替,還有 @SneakyThrows 個人感覺沒什么使用場景。

總結(jié)

不知何時寫 Java代碼可以像C#一樣爽

http://www.cnblogs.com/javanoob/p/lombok.html