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> 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 { 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 { @ToString注解@ToString注解生成toString()方法 @ToStringpublic class ToStringExample { @ToString.Exclude private String name; 屬性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; @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ò)誤 @RequiredArgsConstructor:會(huì)生成一個(gè)包含常量,和標(biāo)識(shí)了NotNull的變量 的構(gòu)造方法。 @RequiredArgsConstructor(staticName='newInstance')public class RequiredArgsConstructorExample { private final String name; @AllArgsConstructor:會(huì)生成一個(gè)包含所有變量,同時(shí)如果變量使用了NotNull annotation , 會(huì)進(jìn)行是否為空的校驗(yàn) @AllArgsConstructor(staticName='newInstance')public class AllArgsConstructorExample { private final String name; 注意:三個(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) { @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捕獲了 @SneakyThrows注解Sneaky的意思是偷偷摸摸地,@SneakyThrows注解的作用就是取代try...catch代碼塊,自動(dòng)生成相應(yīng)的try...catch代碼塊 |
|