Lombok @注解--精简java代码

之前在实习的时候,公司都用@Setter和@Getter注解为JavaBean自动生成set和get方法,大大降低了代码量。查看此注解,发现他们是在一个lombok的包下面:
这里写图片描述

还发现了一些其他的注解类。


度娘发现:

1.Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。

2.Lombok提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO。


由上面可知,Lombok注解是编译时注解,在编译时根据注解自动生成相应的方法。

Lombok官方文档:https://projectlombok.org/features/all

在此只记录常用注解,方便以后自己使用。由于最近使用SpringBoot框架,发现父pom中已经包含此Lombok的jar包,在项目工程中只要直接引用对应的jar包依赖就可以:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

注意,不需要加version信息,因为它是一个子pom,

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

父pom中的Lombok:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
</dependency>

常用注解介绍:

  1. @Setter 注解在属性上,为属性提供 setting 方法
  2. @Getter 注解在属性上,为属性提供 getting 方法
  3. @ToString 注解在类上,生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出。
  4. @Data 注解在类上,提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
  5. @NoArgsConstructor 注解在类上,为类提供一个无参的构造方法
  6. @AllArgsConstructor 注解在类上,为类提供一个全参的构造方法
  7. @EqualsAndHashCode 默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。
  8. @Log4j 注解在类上,为类提供一个static属性名为log 的 log4j 日志对象

直接上代码:

  • @Setter @Getter
public class Person{
    @Getter @Setter
    private String name;

    @Getter @Setter
    private int money;

    public static void main(String[] args){
        Person person=new Person();
        user.setName("XXX");
        user.setMoney(123456789);
        System.out.println(user.getName());
        System.out.println(user.getMoney());
    }
}

输出:

XXX
123456789
  • @ToString
@ToString
public class Person {
    @Getter
    @Setter
    private String name;

    @Getter
    @Setter
    private int money;

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("XXX");
        person.setMoney(123456789);
        System.out.println(person.getName());
        System.out.println(person.getMoney());
        System.out.println(person.toString());
    }
}

输出:

XXX
123456789
Person(name=XXX,money=123456789)
  • @EqualsAndHashCode
@ToString
@EqualsAndHashCode
public class Person {
    @Getter @Setter
    private String name;

    @Getter @Setter
    private int money;

    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setName("XXX");
        person1.setMoney(123456789);

        Person person2=new Person();
        person2.setName("XXX");
        person2.setMoney(123);

        Person person3=new Person();
        person3.setName("XXX");
        person3.setMoney(123456789);

        System.out.println(person1.equals(person2));
        System.out.println(person1.equals(person3));
    }
}

输出:

false
true
  • @Data
@Data
//@ToString
//@EqualsAndHashCode
public class Person {
//    @Getter @Setter
    private String name;

//    @Getter @Setter
    private int money;

    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setName("XXX");
        person1.setMoney(123456789);
        System.out.println(person1.getName());
        System.out.println(person1.getMoney());
        System.out.println(person1.toString());

        Person person2=new Person();
        person2.setName("XXX");
        person2.setMoney(123);

        Person person3=new Person();
        person3.setName("XXX");
        person3.setMoney(123456789);

        System.out.println(person1.equals(person2));
        System.out.println(person1.equals(person3));
    }
}

输出:

XXX
123456789
Person(name=XXX, money=123456789)
false
true
  • @NoArgsConstructor @AllArgsConstructor
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private int money;

    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2=new Person("XXX",123456789);

        System.out.println(person1);
        System.out.println(person2);
    }
}

等同于:

@Data
//@NoArgsConstructor
//@AllArgsConstructor
public class Person {
    private String name;
    private int money;
    //无参构造函数
    public Person(){}
    //全参构造函数
    public Person(String name,int money){
        this.name=name;
        this.money=money;
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2=new Person("XXX",123456789);

        System.out.println(person1);
        System.out.println(person2);
    }
}

输出:

Person(name=null, money=0)
Person(name=XXX, money=123456789)
  • @Log4j
/**
*没有只用@Log4j
*/
@Data
public class Person {
    private Logger logger=Logger.getLogger(getClass());
    private String name;
    private int money;

    public static void main(String[] args) {
        Person person = new Person();
        person.logger.info("----------没有使用@Log4j 注解-----------");
    }
}
/**
*使用@Log4j
*/
@Data
@Log4j(topic = "提示信息:")
public class Person {
    private String name;
    private int money;

    public static void main(String[] args) {
        Person person = new Person();
        person.log.info("----------没有使用@Log4j 注解-----------");
    }
}

输出 :

19:04:25.938 [main] INFO 提示信息: - ----------没有使用@Log4j 注解-----------
19:05:50.206 [main] INFO 提示信息: - ----------使用@Log4j 注解-----------

———————————————这里是分割线—————————————————
Lombok的注释会在代码编译时期,用JSR 269 Pluggable Annotation Processing API(插入式注解处理工具) 生成相应代码。但是在开发阶段,源代码中调用Setter、getter等方法,IDE发现没有这些代码会报错,影响美观,对于强迫症的人来说是不能容忍的。

这里补上IDEA工具中添加Lombok插件方法,来取消在工程开发时,IDE对setter、getter等方法调用的报错问题。
Step1:File->Setting…
这里写图片描述
Step2:Plugins->输入Lombok,点击Browse repositories
这里写图片描述
Step3:找到Lombok Plugin,然后点击Install plugin按钮
这里写图片描述

这里写图片描述

最后推荐一篇讲了Lombok原理的文章:http://blog.csdn.net/ghsau/article/details/52334762

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值