博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lombok用法
阅读量:4149 次
发布时间:2019-05-25

本文共 8095 字,大约阅读时间需要 26 分钟。

一,Lombok用法
  • val:用在局部变量前面,相当于将变量声明为final
  • @NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException)
  • @Cleanup:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成try-finally这样的代码来关闭流
  • @Getter/@Setter:用在属性上,再也不用自己手写setter和getter方法了,还可以指定访问范围
  • @ToString:用在类上,可以自动覆写toString方法,当然还可以加其他参数,例如@ToString(exclude=”id”)排除id属性,或者@ToString(callSuper=true, includeFieldNames=true)调用父类的toString方法,包含所有属性
  • @EqualsAndHashCode:用在类上,自动生成equals方法和hashCode方法
  • @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有@NonNull属性作为参数的构造函数,如果指定staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多
  • @Data:注解在类上,相当于同时使用了@ToString@EqualsAndHashCode@Getter@Setter@RequiredArgsConstrutor这些注解,对于POJO类十分有用
  • @Value:用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法
  • @Builder:用在类、构造器、方法上,为你提供复杂的builder APIs,让你可以像如下方式一样调用Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();更多说明参考
  • @SneakyThrows:自动抛受检异常,而无需显式在方法上使用throws语句
  • @Synchronized:用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性$lock$LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误
  • @Getter(lazy=true):可以替代经典的Double Check Lock样板代码
  • @Log:根据不同的注解生成不同类型的log对象,但是实例名称都是log,有六种可选实现类
    • @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
    • @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
    • @Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);
    • @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
    • @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
    • @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);          
二,代码示例
  • val
  • val示例

    2 3 4 5 6 7 8 9 10 
    public static void main(String[] args) { val sets = new HashSet
    (); val lists = new ArrayList
    (); val maps = new HashMap
    (); //=>相当于如下 final Set
    sets2 = new HashSet<>(); final List
    lists2 = new ArrayList<>(); final Map
    maps2 = new HashMap<>(); }
  • @NonNull示例

2
3
4
public 
void 
notNullExample(
@NonNull 
String string) {
  
string.length();
}
2
3
4
5
6
7
8
9
//=>相当于
 
public 
void 
notNullExample(String string) {
   
if 
(string !=
null
) {
      
string.length();
   
}
else 
{
      
throw 
new 
NullPointerException(
"null"
);
   
}
}
  • @Cleanup示例

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public 
    static 
    void 
    main(String[] args) {
        
    try 
    {
            
    @Cleanup 
    InputStream inputStream =
    new 
    FileInputStream(args[
    0
    ]);
        
    }
    catch 
    (FileNotFoundException e) {
            
    e.printStackTrace();
        
    }
        
    //=>相当于
        
    InputStream inputStream =
    null
    ;
        
    try 
    {
            
    inputStream =
    new 
    FileInputStream(args[
    0
    ]);
        
    }
    catch 
    (FileNotFoundException e) {
            
    e.printStackTrace();
        
    }
    finally 
    {
            
    if 
    (inputStream !=
    null
    ) {
                
    try 
    {
                    
    inputStream.close();
                
    }
    catch 
    (IOException e) {
                    
    e.printStackTrace();
                
    }
            
    }
        
    }
    }
  • @Getter/@Setter示例

    2 3 4 5 
    @Setter (AccessLevel.PUBLIC) @Getter (AccessLevel.PROTECTED) private int id; private String shap;
  • @ToString示例

     
    2 3 4 5 6 7 8 9 10 11 12 
    @ToString (exclude = "id" , callSuper = true , includeFieldNames = true ) public class LombokDemo { private int id; private String name; private int age; public static void main(String[] args) { //输出LombokDemo(super=LombokDemo@48524010, name=null, age=0) System.out.println( new LombokDemo()); } }
  • @EqualsAndHashCode示例

     
    2 3 4 5 6 
    @EqualsAndHashCode (exclude = { "id" , "shape" }, callSuper = false ) public class LombokDemo { private int id; private String shap; }
  • @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor示例

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @NoArgsConstructor
    @RequiredArgsConstructor
    (staticName =
    "of"
    )
    @AllArgsConstructor
    public 
    class 
    LombokDemo {
        
    @NonNull
        
    private 
    int 
    id;
        
    @NonNull
        
    private 
    String shap;
        
    private 
    int 
    age;
        
    public 
    static 
    void 
    main(String[] args) {
            
    new 
    LombokDemo(
    1
    ,
    "circle"
    );
            
    //使用静态工厂方法
            
    LombokDemo.of(
    2
    ,
    "circle"
    );
            
    //无参构造
            
    new 
    LombokDemo();
            
    //包含所有参数
            
    new 
    LombokDemo(
    1
    ,
    "circle"
    ,
    2
    );
        
    }
    }
  • @Data示例

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import 
    lombok.Data;
    @Data
    public 
    class 
    Menu {
        
    private 
    String shopId;
        
    private 
    String skuMenuId;
        
    private 
    String skuName;
        
    private 
    String normalizeSkuName;
        
    private 
    String dishMenuId;
        
    private 
    String dishName;
        
    private 
    String dishNum;
        
    //默认阈值
        
    private 
    float 
    thresHold =
    0
    ;
        
    //新阈值
        
    private 
    float 
    newThresHold =
    0
    ;
        
    //总得分
        
    private 
    float 
    totalScore =
    0
    ;
    }

    在IntelliJ中按下Ctrl+F12就可以看到Lombok已经为我们自动生成了一系列的方法。

  • @Value示例

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Value
    public 
    class 
    LombokDemo {
        
    @NonNull
        
    private 
    int 
    id;
        
    @NonNull
        
    private 
    String shap;
        
    private 
    int 
    age;
        
    //相当于
        
    private 
    final 
    int 
    id;
        
    public 
    int 
    getId() {
            
    return 
    this
    .id;
        
    }
        
    ...
    }
  • @Builder示例

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Builder
    public 
    class 
    BuilderExample {
        
    private 
    String name;
        
    private 
    int 
    age;
        
    @Singular
        
    private 
    Set<String> occupations;
        
    public 
    static 
    void 
    main(String[] args) {
            
    BuilderExample test = BuilderExample.builder().age(
    11
    ).name(
    "test"
    ).build();
        
    }
    }
  • @SneakyThrows示例

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import 
    lombok.SneakyThrows;
    import 
    java.io.FileInputStream;
    import 
    java.io.FileNotFoundException;
    import 
    java.io.InputStream;
    import 
    java.io.UnsupportedEncodingException;
    public 
    class 
    Test {
        
    @SneakyThrows
    ()
        
    public 
    void 
    read() {
            
    InputStream inputStream =
    new 
    FileInputStream(
    ""
    );
        
    }
        
    @SneakyThrows
        
    public 
    void 
    write() {
            
    throw 
    new 
    UnsupportedEncodingException();
        
    }
        
    //相当于
        
    public 
    void 
    read()
    throws 
    FileNotFoundException {
            
    InputStream inputStream =
    new 
    FileInputStream(
    ""
    );
        
    }
        
    public 
    void 
    write()
    throws 
    UnsupportedEncodingException {
            
    throw 
    new 
    UnsupportedEncodingException();
        
    }
    }
  • @Synchronized示例

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public 
    class 
    SynchronizedDemo {
        
    @Synchronized
        
    public 
    static 
    void 
    hello() {
            
    System.out.println(
    "world"
    );
        
    }
        
    //相当于
        
    private 
    static 
    final 
    Object $LOCK =
    new 
    Object[
    0
    ];
        
    public 
    static 
    void 
    hello() {
            
    synchronized 
    ($LOCK) {
                
    System.out.println(
    "world"
    );
            
    }
        
    }
    }
  • @Getter(lazy = true)

2
3
4
5
6
7
8
9
10
11
12
public 
class 
GetterLazyExample {
  
@Getter
(lazy =
true
)
  
private 
final 
double
[] cached = expensive();
  
private 
double
[] expensive() {
      
double
[] result =
new 
double
[
1000000
];
      
for 
(
int 
i =
0
; i < result.length; i++) {
        
result[i] = Math.asin(i);
      
}
    
return 
result;
  
}
}
2
  
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import 
java.util.concurrent.atomic.AtomicReference;
public 
class 
GetterLazyExample {
   
private 
final 
AtomicReference<java.lang.Object> cached =
new 
AtomicReference<>();
   
public 
double
[] getCached() {
      
java.lang.Object value =
this
.cached.get();
      
if 
(value ==
null
) {
          
synchronized 
(
this
.cached) {
              
value =
this
.cached.get();
              
if 
(value ==
null
) {
                  
final 
double
[] actualValue = expensive();
                  
value = actualValue ==
null 
?
this
.cached : actualValue;
                  
this
.cached.set(value);
              
}
          
}
      
}
      
return 
(
double
[]) (value ==
this
.cached ?
null 
: value);
   
}
   
private 
double
[] expensive() {
      
double
[] result =
new 
double
[
1000000
];
      
for 
(
int 
i =
0
; i < result.length; i++) {
          
result[i] = Math.asin(i);
      
}
      
return 
result;
   
}
}
  • @Value:用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法
  • @Builder:用在类、构造器、方法上,为你提供复杂的builder APIs,让你可以像如下方式一样调用Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();更多说明参考
  • @SneakyThrows:自动抛受检异常,而无需显式在方法上使用throws语句
  • @Synchronized:用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性$lock$LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误
  • @Getter(lazy=true):可以替代经典的Double Check Lock样板代码
  • @Log:根据不同的注解生成不同类型的log对象,但是实例名称都是log,有六种可选实现类
    • @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
    • @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
    • @Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);
    • @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
    • @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
    • @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

转载地址:http://mftti.baihongyu.com/

你可能感兴趣的文章
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>
如何防止sql注入
查看>>
springmvc传值
查看>>
在Eclipse中查看Android源码
查看>>
Android使用webservice客户端实例
查看>>
[转]C语言printf
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>