Lombok的官方介紹
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Lombok以簡單的注解形式來簡化java代碼,提高開發人員的開發效率
lombok
是一個編譯級別的插件,它可以在項目編譯的時候生成一些代碼
1.為IntelliJ IDEA安裝插件
file——>settings——>Plugins
安裝完后需要重啟IntelliJ IDEA
2.添加依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.61</version> </dependency> </dependencies>
3.使用
常用注解
@Data 注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法 @Setter :注解在屬性上;為屬性提供 setting 方法 @Setter :注解在屬性上;為屬性提供 getting 方法 @Log4j :注解在類上;為類提供一個 屬性名為log 的 log4j 日志對象 @NoArgsConstructor :注解在類上;為類提供一個無參的構造方法 @AllArgsConstructor :注解在類上;為類提供一個全參的構造方法 @Cleanup : 可以關閉流 @Builder : 被注解的類加個構造者模式 @Synchronized : 加個同步鎖 @SneakyThrows : 等同於try/catch 捕獲異常 @NonNull : 如果給參數加個這個注解 參數為null會拋出空指針異常 @Value : 注解和@Data類似,區別在於它會把所有成員變量默認定義為private final修飾,並且不會生成set方法
(1)@Data
@Data 自動生成set/get方法,toString方法,equals方法,hashCode方法,不帶參數的構造方法
實體類
package com.abc.plus.entity; import lombok.Data; import java.util.Date; @Data public class ApiFiles { private Long id; private String name; private Integer size; private Integer status; private Date uploadTime; private String version; }
測試
package com.abc.plus.controller; import com.abc.plus.core.Result; import com.abc.plus.core.SnowFlake; import com.abc.plus.entity.ApiFiles; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController public class demoController { private SnowFlake sn; @RequestMapping("/test") public Result test(){ sn = new SnowFlake(1,1); ApiFiles file = new ApiFiles(); file.setId(sn.nextId()); int r= (int) (Math.random() * 50 + 500); file.setName("file"+String.valueOf(r)); file.setSize(r); file.setStatus(1); Date currentTime = new Date(); file.setUploadTime(currentTime); return Result.success(200,file); } }
SnowFlake

package com.abc.plus.core; import com.alibaba.fastjson.JSON; /** * Created by Beibei on 19/02/22 * API響應結果 */ public class Result<T> { private int code; private String message; private T data; public Result setCode(Integer code) { this.code = code; return this; } public int getCode() { return code; } public String getMessage() { return message; } public Result setMessage(String message) { this.message = message; return this; } public T getData() { return data; } public Result setData(T data) { this.data = data; return this; } @Override public String toString() { return JSON.toJSONString(this); } public static <T> Result<T> fail(Integer code,T data) { Result<T> ret = new Result<T>(); ret.setCode(code); ret.setData(data); return ret; } public static <T> Result<T> failMessage(Integer code,String msg) { Result<T> ret = new Result<T>(); ret.setCode(code); ret.setMessage(msg); return ret; } public static <T> Result<T> successMessage(Integer code,String msg) { Result<T> ret = new Result<T>(); ret.setCode(code); ret.setMessage(msg); return ret; } public static <T> Result<T> success(Integer code,T data) { Result<T> ret = new Result<T>(); ret.setCode(code); ret.setData(data); return ret; } public static <T> Result<T> success(Integer code,T data,String msg) { Result<T> ret = new Result<T>(); ret.setCode(code); ret.setData(data); ret.setMessage(msg); return ret; } }
Result

package com.abc.plus.core; public class SnowFlake { /** * 起始的時間戳 */ private final static long START_STMP = 1480166465631L; /** * 每一部分占用的位數 */ private final static long SEQUENCE_BIT = 12; //序列號占用的位數 private final static long MACHINE_BIT = 5; //機器標識占用的位數 private final static long DATACENTER_BIT = 5;//數據中心占用的位數 /** * 每一部分的最大值 */ private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); /** * 每一部分向左的位移 */ private final static long MACHINE_LEFT = SEQUENCE_BIT; private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; private long datacenterId; //數據中心 private long machineId; //機器標識 private long sequence = 0L; //序列號 private long lastStmp = -1L;//上一次時間戳 public SnowFlake(long datacenterId, long machineId) { if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) { throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0"); } if (machineId > MAX_MACHINE_NUM || machineId < 0) { throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0"); } this.datacenterId = datacenterId; this.machineId = machineId; } /** * 產生下一個ID * * @return */ public long nextId() { long currStmp = getNewstmp(); if (currStmp < lastStmp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id"); } if (currStmp == lastStmp) { //相同毫秒內,序列號自增 sequence = (sequence + 1) & MAX_SEQUENCE; //同一毫秒的序列數已經達到最大 if (sequence == 0L) { currStmp = getNextMill(); } } else { //不同毫秒內,序列號置為0 sequence = 0L; } lastStmp = currStmp; return (currStmp - START_STMP) << TIMESTMP_LEFT //時間戳部分 | datacenterId << DATACENTER_LEFT //數據中心部分 | machineId << MACHINE_LEFT //機器標識部分 | sequence; //序列號部分 } private long getNextMill() { long mill = getNewstmp(); while (mill <= lastStmp) { mill = getNewstmp(); } return mill; } private long getNewstmp() { return System.currentTimeMillis(); } }
啟動項目
http://localhost:8080/test
返回結果
{
"code": 200,
"message": null,
"data": {
"id": 400317896322060288,
"name": "file507",
"size": 507,
"status": 1,
"uploadTime": "2019-12-06T05:21:29.661+0000",
"version": null
}
}
(2)@Builder
實體類
package com.abc.plus.entity; import lombok.Builder; import lombok.Data; import java.util.Date; @Builder @Data public class ApiFiles { private Long id; private String name; private Integer size; private Integer status; private Date uploadTime; private String version; }
測試
package com.abc.plus.controller; import com.abc.plus.core.Result; import com.abc.plus.core.SnowFlake; import com.abc.plus.entity.ApiFiles; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController public class demoController { private SnowFlake sn; @RequestMapping("/test") public Result test(){ sn = new SnowFlake(1,1); Long id= sn.nextId(); int r= (int) (Math.random() * 50 + 500); Date currentTime = new Date(); ApiFiles file = ApiFiles.builder() .id(id) .name("file"+String.valueOf(r)) .size(r) .status(1) .uploadTime(currentTime) .build(); return Result.success(200,file); } }
(3)@NonNull
實體類
package com.abc.plus.entity; import lombok.Builder; import lombok.Data; import lombok.NonNull; import java.util.Date; @Builder @Data public class ApiFiles { private Long id; private String name; private Integer size; private Integer status; private Date uploadTime; @NonNull private String version; }
用上邊的測試方法測試,沒給version賦值,輸出結果
{
"timestamp": "2019-12-06T05:40:09.861+0000",
"status": 500,
"error": "Internal Server Error",
"message": "version is marked non-null but is null",
"path": "/test"
}
修改為
ApiFiles file = ApiFiles.builder() .id(id) .name("file"+String.valueOf(r)) .size(r) .status(1) .uploadTime(currentTime) .version("11") .build();
結果
{
"code": 200,
"message": null,
"data": {
"id": 400323058746920960,
"name": "file547",
"size": 547,
"status": 1,
"uploadTime": "2019-12-06T05:42:00.479+0000",
"version": "11"
}
}
還有很多,先寫這些了
總結:
Lombok的優點:
能通過注解的形式自動生成代碼,提高了一定的開發效率;
讓代碼變得簡潔,簡化了維護工作
不足:
eclipse或IntelliJ IDEA需要安裝相應的插件;
不支持多種參數構造器的重載;
降低了源代碼的可讀性和完整性