一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

優(yōu)雅的Java工具庫(kù)Lombok

 xkl135 2018-08-21

Lombok簡(jiǎn)介


Lombok是一個(gè)非常實(shí)用的Java工具庫(kù),有效地簡(jiǎn)化Java代碼的冗長(zhǎng)。它通過(guò)注解如@Data可以直接為Java bean在編譯期動(dòng)態(tài)地生成字段的getter/setter方法,使用注解@NoArgsConstructor 和@AllArgsConstructor 為Java bean添加無(wú)參構(gòu)造器和有參構(gòu)造器,甚至可以在Java代碼中使用val和var聲明一個(gè)動(dòng)態(tài)變量,而無(wú)需再指定具體的變量類型,區(qū)別只是val聲明的變量為final。


Lombok還提供了delombok供生成Javadoc,delombok在運(yùn)行時(shí)會(huì)將注解@Data轉(zhuǎn)換成getter/setter方法,然后移除@Data注解,如果哪天不再需要Lombok,也只需要簡(jiǎn)單運(yùn)行delombok即可。Lombok的構(gòu)建支持maven和gradle,同時(shí)eclipse、myeclipse和idea等主流IDE也都和lombok兼容,所以可以放心大膽地使用Lombok,不用擔(dān)心IDE的編譯檢查問(wèn)題。


Lombok栗子


Eclipse安裝Lombok支持


官網(wǎng)Lombok https:///download 下載jar包或者通過(guò)構(gòu)建工具maven,gradle下載jar包


雙擊jar包,jar包內(nèi)的安裝器會(huì)自動(dòng)運(yùn)行尋找eclipse



點(diǎn)擊【Install/Update】



引入Lombok依賴



<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.2</version>
    <scope>provided</scope>
</dependency>



Lomok注解使用


Lombok的注解分為穩(wěn)定版本和試驗(yàn)版本,這里主要介紹穩(wěn)定版本,因?yàn)樵囼?yàn)版本的支持目前和IDE不是很好


@Getter/@Setter注解


@Getter/@Setter注解的作用就是為字段添加getter/setter方法,可標(biāo)注在類上,也可標(biāo)注在字段上。標(biāo)注在類上表示所有的非靜態(tài)(no-static)字段都會(huì)生成相應(yīng)的getter/setter方法,標(biāo)注在字段上表示只為這個(gè)字段生成,且會(huì)覆蓋標(biāo)注在類上的注解??稍O(shè)置訪問(wèn)級(jí)別,默認(rèn)為public。@Setter不可以標(biāo)注final字段


@Getter@Setterpublic class SetterExample {    
    @Getter(value=AccessLevel.PRIVATE)@Setter
    private String name;    
    //onMethod=@__({@AnnotationsHere})
    @Setter(onMethod=@__({@Deprecated}))    private String age;    
    //onParam=@__({@AnnotationsHere})
    @Setter(onParam=@__({}))    private String sex;    
    public static void main(String[] args) {
        SetterExample se = new SetterExample();
        se.setName('zhangsan');
        se.setAge('16');
        System.out.println(se.getAge());
        System.out.println(se.getName());
    }
}


Lombok提供了onX的試驗(yàn)屬性,分別為:onMethod, onParam, onConstructor,用于向生成的方法,構(gòu)造器,參數(shù)添加注解

反編譯后結(jié)果



@NonNull注解


@NonNull注解標(biāo)注方法和構(gòu)造器的參數(shù),如果參數(shù)為null,則會(huì)拋出空指針異常,不需要在代碼中進(jìn)行null檢測(cè)


public class NonNullExample {
    @Getter    private String name;    
    public NonNullExample(@NonNull String name){        this.name = name;
    }    
    public static void main(String[] args){
        String name = null;
        NonNullExample nne = new NonNullExample(name);
        System.out.println(nne.getName());
    }
}


@ToString注解


@ToString注解生成toString()方法


@ToStringpublic class ToStringExample {    @ToString.Exclude    private String name;    
    @ToString.Include    private String age;    
    private String sex;    
    public static void main(String[] args) {
        ToStringExample tse = new ToStringExample();
        System.out.println(tse.toString());
    }
}


屬性includeFieldNames,默認(rèn)為true,包含屬性值

屬性callSuper,默認(rèn)為false,調(diào)用父類實(shí)現(xiàn)

屬性onlyExplicitlyIncluded,默認(rèn)為false,僅包含明確包含的屬性

@ToString.Exclude 標(biāo)注屬性值不包含在toString()方法中

@ToString.Include標(biāo)注屬性值包含在toString()方法中


@EqualsAndHashCode


@EqualsAndHashCode注解生成equals()和hashcode()方法,注解的屬性和@ToString類似


@EqualsAndHashCodepublic class EqualsAndHashcodeExample {    private String name;    private String age;    private String sex;    
    public static void main(String[] args) {
        EqualsAndHashcodeExample ehe1 = new EqualsAndHashcodeExample();
        EqualsAndHashcodeExample ehe2 = new EqualsAndHashcodeExample();
        System.out.println(ehe1.equals(ehe2));
        System.out.println(ehe1.hashCode());
        System.out.println(ehe2.hashCode());
    }
}


@NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor


@NoArgsConstructor : 生成一個(gè)無(wú)參數(shù)的構(gòu)造方法


@NoArgsConstructor(force=true, staticName='newInstance')public class NoArgsConstructorExample {    //包含的final字段如果沒(méi)有初始化,需要加上force=true強(qiáng)制初始化,否則編譯錯(cuò)誤
    private final String name;    
    //不會(huì)進(jìn)行null檢查
    @NonNull
    @Getter
    private String age;    
    private String sex;    
    public static void main(String[] args) {
        NoArgsConstructorExample nace1 = new NoArgsConstructorExample();
        System.out.println(nace1.getAge());
        NoArgsConstructorExample nace2 = NoArgsConstructorExample.newInstance();
        System.out.println(nace2.getAge());
    }
}


@RequiredArgsConstructor:會(huì)生成一個(gè)包含常量,和標(biāo)識(shí)了NotNull的變量 的構(gòu)造方法。


@RequiredArgsConstructor(staticName='newInstance')public class RequiredArgsConstructorExample {    private final String name;    
    @NonNull
    @Getter
    private String age;    
    private String sex;    
    public static void main(String[] args) {
        RequiredArgsConstructorExample race1 = new RequiredArgsConstructorExample('lisi''18');
        System.out.println(race1.getAge());
        RequiredArgsConstructorExample race2 = RequiredArgsConstructorExample.newInstance('zhangsan''16');
        System.out.println(race2.getAge());
    }
}


@AllArgsConstructor:會(huì)生成一個(gè)包含所有變量,同時(shí)如果變量使用了NotNull annotation , 會(huì)進(jìn)行是否為空的校驗(yàn)


@AllArgsConstructor(staticName='newInstance')public class AllArgsConstructorExample {    private final String name;    
    @NonNull
    @Getter
    private String age;    
    private String sex;    public static void main(String[] args) {
        AllArgsConstructorExample aace1 = new AllArgsConstructorExample('zhangsan''18''female');
        System.out.println(aace1.getAge());
        AllArgsConstructorExample aace2 = AllArgsConstructorExample.newInstance('lisi''16''male');
        System.out.println(aace2.getAge());
    }
}


注意:三個(gè)注解生成的構(gòu)造器都可以指定訪問(wèn)權(quán)限,同時(shí)也可以提供一個(gè)靜態(tài)方法來(lái)供調(diào)用。三個(gè)注解的區(qū)別在于對(duì)final和@NonNull字段的處理不同

另外關(guān)于staticName屬性,Lombok源碼注釋如下:


If set, the generated constructor will be private, and an additional static 'constructor' is generated with the same argument list that wraps the real constructor.


很明顯三個(gè)注解都是可以使用構(gòu)造器直接創(chuàng)建對(duì)象的,也可以使用靜態(tài)方法創(chuàng)建對(duì)象,不知道這段注釋是什么意思???


@Data注解


等同于@ToString, @EqualsAndHashcode, @Getter, @Setter和@RequiredArgsConstructor一起使用


@Value


@Value注解為不可變類型的@Data,是@Data的一個(gè)變種。它標(biāo)注的類和字段都會(huì)被聲明為final


@Builder注解


@Builder注解為類生成builder api以供調(diào)用。Builder是一種解決包含數(shù)量巨大且繁雜的字段的類的一種構(gòu)建方式。


假如一個(gè)類有幾十個(gè)字段,那么該如何設(shè)計(jì)這個(gè)類呢?


方法一:將幾十個(gè)字段都添加在構(gòu)造函數(shù)中。簡(jiǎn)單粗暴,而且在構(gòu)造函數(shù)中為字段初始化也能夠保證對(duì)象能夠正確創(chuàng)建。缺點(diǎn)就是幾十個(gè)參數(shù)只會(huì)導(dǎo)致你在創(chuàng)建對(duì)象時(shí)記錯(cuò)參數(shù)的位置,導(dǎo)致不必要的麻煩。


方法二:依賴注入。Spring的核心功能之一就是依賴注入,借助這種思想,我們通過(guò)無(wú)參構(gòu)造創(chuàng)建一個(gè)對(duì)象,然后通過(guò)setter方法設(shè)置必需的屬性。這種方式可以根據(jù)需求初始化相關(guān)屬性,且邏輯清晰,但也會(huì)造成代碼繁瑣,需要調(diào)用多次setter方法。


方法三:Builder模式。建造者模式的思想就是將一個(gè)大的類的構(gòu)建分為幾部分創(chuàng)建,從而簡(jiǎn)化創(chuàng)建的復(fù)雜性。


@Builderpublic class BuilderExample {    private String name;    private String age;    private String sex;    public static void main(String[] args) {
        BuilderExample be = BuilderExample.builder().name('zhangsan').age('16').sex('male').build();

        System.out.println(BuilderExample.builder().name('zhangsan').age('16').sex('male'));
    }
}


@Log


@Log注解為類添加一個(gè)日志對(duì)象log,類型為java.util.logging.Logger

這個(gè)類有很多變種,詳情如下:

@CommonsLogprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);@Floggerprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();@JBossLogprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);@Logprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());@Log4jprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);@Log4j2private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);@Slf4jprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);@XSlf4jprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);


@CleanUp注解


@CleanUp注解用于關(guān)閉資源,調(diào)用資源的close()方法


public class CleanUpExample {

    @SneakyThrows({FileNotFoundException.class, Exception.class})    public static void main(String[] args) {
        File file = new File('C:/Users/wang2/Desktop/11.jpg');        @Cleanup
        FileInputStream is = new FileInputStream(file);        @Cleanup
        FileOutputStream os = new FileOutputStream(new File('C:/Users/wang2/Desktop/111.jpg'));        
        byte[] buffer = new byte[1024];        int length = 0;        while((length = is.read(buffer)) != -1){
            os.write(buffer, 0, length);
        }
    }
}


注意:拋出的異常被@SneakyThrows捕獲了



@SneakyThrows注解


Sneaky的意思是偷偷摸摸地,@SneakyThrows注解的作用就是取代try...catch代碼塊,自動(dòng)生成相應(yīng)的try...catch代碼塊

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产又粗又猛又爽又黄| 亚洲欧美日韩熟女第一页| 欧美精品一区二区水蜜桃| 中日韩美女黄色一级片| 中文字幕高清不卡一区| 欧美一级片日韩一级片| 国产原创激情一区二区三区| 亚洲中文在线中文字幕91| 高清免费在线不卡视频| 国产一区二区不卡在线视频| 日韩免费成人福利在线| 国产黄色高清内射熟女视频| 国产亚洲精品久久久优势| 日韩在线视频精品视频| 国产欧美日韩精品一区二区| 亚洲欧美日韩国产综合在线| 日本少妇aa特黄大片| 亚洲视频一区自拍偷拍另类| 精品日韩中文字幕视频在线| 国产精品成人免费精品自在线观看| 后入美臀少妇一区二区| 久久99亚洲小姐精品综合| 欧美三级精品在线观看| 色婷婷国产精品视频一区二区保健 | 国产av天堂一区二区三区粉嫩| 国产人妻精品区一区二区三区| 亚洲欧美日韩国产综合在线| 欧美精品在线观看国产| 福利视频一区二区三区| 国产成人精品一区二区三区| 国产乱人伦精品一区二区三区四区| 成年午夜在线免费视频| 国语久精品在视频在线观看| 中文字幕精品少妇人妻| 国产又粗又猛又黄又爽视频免费 | 久久三级国外久久久三级| 午夜福利视频偷拍91| 人妻人妻人人妻人人澡| 经典欧美熟女激情综合网| 深夜福利亚洲高清性感| 日韩国产亚洲欧美另类|