Lombok介绍及其各类注解简单使用

Lombok介绍及其简单使用

1、Lombok到底要不要使用?看看别人的文章

Lombok插件到底要不要用?推荐使用的网友这样说: - 知乎 (zhihu.com)

Lombok插件到底要不要用?看到很多网友对这个话题进行讨论,推荐使用的网友认为,自动化配置也需要了解代码背后的实现,技术人科普一下使用及注意事项也是好事。而不推荐使用的网友则认为Lombok本质上是一个预处理程序,最大的问题是你看到的代码和编译器看到的代码不一样,会导致很多问题无法及时发现,跟C的define类似,所以不推荐使用。那么,你们觉得Lombok插件值得使用吗?

推荐使用的网友这样说:

1、市场有需求就会流行,普惠性比较高,只要能提高生产力(节约开发成本,创造价值)的工具都是好工具。如果几年后这个需求还在,还会有“lombok完善版”出现(这个作者可能是你我他)

2、我觉得作为现如今大部分的开发人员,在开发中面对的是如何快速的开发,而不是去想是否会破坏源码的可读性和完整性;所以我推荐使用。当然也有一部分资深程序员会认为不推荐使用;不做评论,

3、就像数码宝贝进化似的,一开始进化的画面很是详细,到了后面因时间问题进化画面不再是那么必要的后,闪个光就进化了,刚学java的确实不适合用,但是考虑到开发进度,还是很有必要去用的。

4、省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度;看似没有多么重要的小改动,其实反而是为了表面简洁而简洁。 说这句话的人我感觉你不适合干开发

5、代码的功能是为了实现更多的功能,如果花时间去写getter/setter,也不是程序开发者想要的,目的就是花最少的时间,实现最有价值的功能

6、用了lombok省了不少事,而且也不会给性能带来那么重的负担,手写get set 早晚会因为手误出bug,一个女孩会因为戴项链而被压死吗,明显不会,一个团队一块做开发,统一用一个插件还统一不起来?真搞不懂不推荐的人的理由在哪里

7、非常赞同使用,人都不断在在进化,机器也是一样,更何况一帮程序员呢,一些简单无意义的操作。为和要重复再重复?难道不应该留点精力去做其他的事情么?

8、我是一个极其讨厌冗长代码的人,真的看过去脑壳痛,也有强迫症。所以必须使用lombok,如果真有特殊字段需要查看,可以单独写这个字段的get,set.大部分字段都跟咸鱼一般,没什么卵用。but,在公司内网开发,插件都下不了,所以公司开发还是生成的get,set.

不推荐使用的网友这样说:

1、虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度;看似没有多么重要的小改动,其实反而是为了表面简洁而简洁

2、实体类所有的内容还是字节构建的好,虽然可以使框架的用注解来代替一部分内容,可以一旦实体类中出现其他问题,就很难查找到问题,而且此框架省略的代码,也可以使用工具自动生成,生成后,我们也可以自行更改内容,而不局限于注解动态生成的

3、为了简介而简介。而且现在的各种IDE自动生成代码功能都很强大,并没有节省多少事。最重要的是:只要有一个用这种东西,全组都被迫得用

4、胁迫使用!当你的源代码中使用了Lombok,恰好你的代码又被其他的人所使用,那么依赖你代码的人,也必须安装Lombok插件(不管他们喜不喜欢),同时还要花费时间去了解Lombok注解的使用情况,如果不那么做,代码将无法正常运行。使用过Lombok之后,我发现这是一种很流氓的行为。

5、存在即合理从来都是一个错误的言论。黑格尔的愿意是存在是有原因的。而Lombok的存在固然是有原因的,但是不使用的理由也是相当充分的。因此,还是看开发团队的代码规范吧。

6、索然省去了生成setter/getter,构造方法和toString的麻烦,但代码可读性降低;另当字段过多时,生成的含参构造方法的顺序不确定;代码运行需要配置相关插件

7、不推荐,在有些代码不规范的项目里,如驼峰命名不规范,可能会导致一些未知问题,已在实际项目中遇到过两次这种不清楚的问题,最后都是修改了get和set方法得到了解决。

8、总所周知,java早期风靡的原因不是代码优美、程序员能偷懒,而是程序员能够花非常小的代价就能协同工作、项目能够灵活的部署和可控的代码管理。 再看lombok。。。很不java。。。 再说,那些用lombok的同事,你们用lombok可以,但是用完后,找个工具把缺少的代码补回来再提交代码会死嘛。。。点一点,不比你们每个类加个标签要慢。

2、Lombok的使用

①、 Lombok介绍

那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省去我们手动创建这些代码的麻烦,它能够在我们编译源码的时候自动帮我们生成这些方法。

lombok能够达到的效果就是在源码中不需要写一些通用的方法,但是在编译生成的字节码文件中会帮我们生成这些方法,这就是lombok的神奇作用。

②、使用

最新版的IDEA已经捆包了Lombok插件(使用Lombok插件是必须的),所以不需要我们额外下载插件

1、导入依赖
<!--lombok最新版本-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

版本号可不用写,IDEA已经将其纳入自动管理

2、常用注解:

以如下实体类为例
在这里插入图片描述

1、@Getter/@Setter

在这里插入图片描述

2、@ToString

在这里插入图片描述

3、@EqualsAndHashCode

自动生成 equals(Object other) 和 hashcode() 方法,包括所有非静态变量和非 transient 的变量
在这里插入图片描述
如果某些变量不想要加进判断,可以透过 exclude 排除,也可以使用 of 指定某些字段
@EqualsAndHashCode(exclude = “name”)

编译后的class文件:

public class User2 {
    private Integer id;
    private String name;

    public User2() {
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof User2)) {
            return false;
        } else {
            User2 other = (User2)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$id = this.id;
                Object other$id = other.id;
                if (this$id == null) {
                    if (other$id != null) {
                        return false;
                    }
                } else if (!this$id.equals(other$id)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof User2;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $id = this.id;
        int result = result * 59 + ($id == null ? 43 : $id.hashCode());
        return result;
    }
}

Q : 为什么只有一个整体的 @EqualsAndHashCode 注解,而不是分开的两个 @Equals 和 @HashCode?
A : 在 Java 中有规定,当两个对象 equals 时,他们的 hashcode 一定要相同,反之,当 hashcode 相同时,对象不一定
equals。所以 equals 和 hashcode 要一起实现,免得发生违反 Java 规定的情形发生

4.@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

这三个很像,都是在自动生成该类的构造器,差别只在生成的构造器的参数不一样而已
@NoArgsConstructor : 生成一个没有参数的构造器
在这里插入图片描述
@AllArgsConstructor : 生成一个包含所有参数的构造器
在这里插入图片描述

这里注意一个 Java 的小坑,当我们没有指定构造器时,Java 编译器会帮我们自动生成一个没有任何参数的构造器给该类,但是
如果我们自己写了构造器之后,Java 就不会自动帮我们补上那个无参数的构造器了然而很多地方(像是 Spring Data JPA),会需要每个类都一定要有一个无参数的构造器,所以你在加上 @AllArgsConstructor 时,一定要补上 @NoArgsConstrcutor,不然会有各种坑等着你

这是java基础入门时讲到构造函数时会提到的注意点,我们值得注意

@RequiredArgsConstructor : 生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量
在这里插入图片描述
补充:如果所有的变量都是正常的,都没有用 final 修饰的话,那就会生成一个没有参数的构造器

5.@Data

整合包,只要加了 @Data 这个注解,等于同时加了以下注解
@Getter/@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
在这里插入图片描述
@Data 是使用频率最高的 lombok 注解,通常 @Data 会加在一个值可以被更新的对象上,像是日常使用的 DTO 们、或是 JPA里的 Entity 们,就很适合加上 @Data 注解,也就是 @Data for mutable class

6.@Value

也是整合包,但是他会把所有的变量都设成 final 的,其他的就跟 @Data 一样,等于同时加了以下注解
@Getter (注意没有setter)
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
在这里插入图片描述
上面那个 @Data 适合用在 POJO 或 DTO 上(实体类),而这个 @Value 注解,则是适合加在值不希望被改变的类上,像是某个类的值当创建后就不希望被更改,只希望我们读它而已,就适合加上 @Value 注解,也就是 @Value for immutable class

另外注意一下,此 lombok 的注解 @Value 和另一个 Spring 的注解 @Value 撞名,在 import 时不要 import 错了

7、@Builder

自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了(创建对象时)
在这里插入图片描述
例如:
在这里插入图片描述
注意,虽然只要加上 @Builder 注解,我们就能够用流式写法快速设定对象的值,
但是 setter 还是必须要写不能省略的,因为Spring 或是其他框架有很多地方都会用到对象的 getter/setter 对他们取值/赋值

所以通常是 @Data 和 @Builder 会一起用在同个类上,既方便我们流式写代码,也方便框架做事

8. @Slf4j

自动生成该类的 log 静态常量,要打日志就可以直接打,不用再手动 new log 静态常量了
在这里插入图片描述
编译后的文件:
在这里插入图片描述

除了 @Slf4j 之外,lombok 也提供其他日志框架的变种注解可以用,像是 @Log、@Log4j…等,他们都是帮我们创建一个静态
常量 log,只是使用的库不一样而已
@Log //对应的log语句如下privatestaticfinal java.util.logging.Logger log =
java.util.logging.Logger.getLogger(LogExample.class.getName());

@Log4j //对应的log语句如下privatestaticfinal
org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
SpringBoot默认支持的就是 slf4j + logback 的日志框架,所以也不用再多做啥设定,直接就可以用在 SpringBoot project上,
log 系列注解最常用的就是 @Slf4j
文章注解详解来源:微信公众号-古古说

简单使用

在这里插入图片描述
结构视图打开方法:
在这里插入图片描述
结构的作用是为了看加上Lombok注解后给我们自动添加了什么,同时也可以在编译后的文件中查看
在这里插入图片描述
代码:

//@Getter   //自动生成getter方法
//@Setter   //自动生成setter方法
//@ToString //自动生成toString方法
//@EqualsAndHashCode(exclude = "name")   // exclude = "name"排除不需要比较的属性 加上这个注解会重写equals, 帮助去判断对象的值是否相等, 以前是判断对象的应用地址是否相等
//@NoArgsConstructor //无参的构造函数
//@AllArgsConstructor //所有属性的构造函数
//@RequiredArgsConstructor  // 为必须的属性(final、@NonNull),生成构造函数
@Data
/*
  @Data整合包,只要加了 @Data 这个注解,等于同时加了以下注解
  @Getter/@Setter
  @ToString
  @EqualsAndHashCode
  @RequiredArgsConstructor
 */
//@Value   它跟@Data的区别就是会为属性自动改为final
@Slf4j //自动生成该类的 log 静态常量,要打日志就可以直接打,不用再手动 new log 静态常量了
public class User {
    private Integer id;
    //@NonNull //这个注解就是表示这个字段必须的
    private String name;

    public void mylog() {
        log.error("测试");
    }
}

测试:

@Test
void contextLoads() {
    User user1 = new User();
    user1.setId(1);
    user1.setName("a");

    User user2 = new User();
    user2.setId(1);
    user2.setName("a");

    user1.mylog();
    user2.mylog();

    System.out.println(user1.equals(user2));
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心醉瑶瑾前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值