久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

優(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ú)需再指定具體的變量類(lèi)型,,區(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依賴(lài)



<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)注在類(lèi)上,,也可標(biāo)注在字段上,。標(biāo)注在類(lèi)上表示所有的非靜態(tài)(no-static)字段都會(huì)生成相應(yīng)的getter/setter方法,標(biāo)注在字段上表示只為這個(gè)字段生成,,且會(huì)覆蓋標(biāo)注在類(lèi)上的注解,。可設(shè)置訪(fǎng)問(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)用父類(lèi)實(shí)現(xiàn)

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

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

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


@EqualsAndHashCode


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


@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)造器都可以指定訪(fǎng)問(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注解為不可變類(lèi)型的@Data,,是@Data的一個(gè)變種,。它標(biāo)注的類(lèi)和字段都會(huì)被聲明為final


@Builder注解


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


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


方法一:將幾十個(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)致不必要的麻煩,。


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


方法三:Builder模式。建造者模式的思想就是將一個(gè)大的類(lèi)的構(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注解為類(lèi)添加一個(gè)日志對(duì)象log,,類(lèi)型為java.util.logging.Logger

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

@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)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(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)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多