当前位置: 澳门新濠3559 > 编程 > 正文

通过使用对应的注解,性能在未使用

时间:2019-10-06 23:47来源:编程
在去北京培训的时候,讲师说到了 lombok 这个第三方插件包,使用了之后发现,确实是个神奇,避免了编写很多臃肿的且定式的代码,虽然现代的 IDE 都能通过快捷键或者右键的方式,使

在去北京培训的时候,讲师说到了lombok这个第三方插件包,使用了之后发现,确实是个神奇,避免了编写很多臃肿的且定式的代码,虽然现代的IDE都能通过快捷键或者右键的方式,使用Generate Getters and Setters快速生成setters/getters,但当某一个字段修改或者添加字段时,又需要重复的操作一遍,但使用了lombok之后。一切都是自动的,除了最常用的生成setters/getters,还有诸如:自动生成toString方法、equals、·haashcode·等,还能快速生成Builder模式的javabean类,实在是方便。程序猿是很懒的,一切重复的工作都想通过脚本或者自动化工具来完成,所以,使用lombok吧。

我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要增加属性或者对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法。这样重复的劳动没有任何意义,Lombok里面的注解可以轻松解决这些问题。

为何要使用Lombok

我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要增加属性或者对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法。这样重复的劳动没有任何意义,Lombok里面的注解可以轻松解决这些问题。

背景

最近在做一个小功能,又不想在原有体态臃肿的项目中追加,为了调试方便并且可以快速开发就采用了springboot。由于使用了JPA,建了几个类,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,那么Java中有没有一种方式能够避免这种重复的劳动呢?答案是有,想着前几天听说有一款简化神奇Lombok,特此拿来玩玩记录一下。

Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官方地址:https://projectlombok.org/,github地址:通过使用对应的注解,性能在未使用。https://github.com/rzwitserloot/lombok。

  • 简化冗余的JavaBean代码,使得实体文件很简洁。
  • 大大提高JavaBean中方法的执行效率,省去重复的步骤

Lombok简介

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

简介

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

下载好了Lombok  ,打开Lombok

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

Lombok问题

无法支持多种参数构造器的重载

Lombok注解

下面对Lombok的简单使用方法做一下总结:

  • @NotNull 作用在方法参数上的注解,用于自动生成空值参数检查。
  • @Cleanup 作用在局部变量上,在作用域结束时会自动调用close方法释放资源。
  • @Getter 作用在字段上,会自动生成字段的Getter;作用在类上,会自动生成该类所有非静态字段的Getter,还能控制Getter的访问级别
  • @Setter 基本同上。
  • @ToString 类注解,自动生成类的toString方法,可以做一些定制,比如不使用某个字段,不调用Getters等。
  • @EqualsAndHashCode 类注解,自动生成类中所有非静态非瞬时字段的equals方法和hashCode方法。
  • @NoArgsConstructor 类注解,自动生成一个无参构造函数。
  • @AllArgsConstructor 类注解,生成一个初始化所有字段的构造函数。
  • @RequiredArgsConstructor 类注解,为final字段和标记了@NotNull的字段生成构造函数。
  • @Data 类注解,相当于同时应用了@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。如果已经定义了一个构造方法,就不会再自动生成构造方法了。
  • @Value 类注解,和@Data类似,但是用于不可变类型。生成的类和所有字段都设置为final,所有字段都为private,自动生成Getter但是没有Setter,会生成初始化所有字段的构造函数。相当于同时应用了final @ToString、 @EqualsAndHashCode、 @AllArgsConstructor 、@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)和 @Getter。

实际开发中一般常用到的:
@Data
@NoArgsConstructor
@AllArgsConstructor
这三个,其他的没特殊需求可以自行忽略。

图片 1

官方地址:

Lombok使用

1.添加maven依赖

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

2.idea中需要添加插件才能支持Lombok
1.下载插件 \192.168.188.22互联网金融事业部信息技术部softide-pluginslombok-plugin-0.13.16.zip
2.安装插件并重启

图片 2

安装插件.png

3.Lombok的使用,介绍了几个常用的注解

@Getter / @Setter
可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。
@EqualsAndHashCode
默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。
@ToString
生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。
@Data:包含@ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,基本上使用这个注解就足够了。
更多的请参见:https://projectlombok.org/features/index.html。

maven引用

由于开发中我们使用了Maven,直接在pom.xml中引入以下坐标:

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

下面是简单Bean示例:

@Data         // 生成 getter/setter/equals/canEqual/hashCode/toString        
@NoArgsConstructor     // 为类提供一个无参的构造方法 
@AllArgsConstructor    // 为类提供一个全参的构造方法
public class User {
   private Integer id;
   private String name;
   private Integer age;
} 

为了对比效果,下面是我们平时生成的Bean:

public class User {
    private Integer id;
    private String name;
    private Integer age;

    public User() {
        super();
    }

    public User(Integer id, String name, Integer age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

可以看到,由于应用了@Data注解和两个构造方法注解,代码变得非常短小易读。当然Lombok也是存在诸多问题的,比如无法支持多种参数构造器的重载,需要安装IDE插件实现get,set效果。

点击Install/Update  如果没有检测到编译器的话 ,麻烦自己检索目录。(点Specify location...)

官网对其解释为:

Lombok原理

虽然Lombok也用到了注解,但是它并没有用到反射,而是通过一些奇技淫巧,在代码编译时期动态将注解替换为具体的代码。所以JVM实际运行的代码,和我们手动编写的包含了各种工具方法的类相同。

ok之后关了。重启编译器。就Ok了

图片 3image

插件安装

其实,一开始博主以为不需要任何插件支持的,即使项目中引入了坐标,当你get属性的时候也会报错。

官网中其实提供了相关的配置,由于使用的是Eclipse,这里简单的说下Eclipse种的安装步骤。

1.下载lombok.jar包

2.双击运行(有些系统安装的压缩包的问题可能无法执行)
图片 4

图片 5

3.重启Eclipse,然后update一下Maven项目即可。

注解介绍

这里简单说下lombok实现的原理:主要是通过抽象语法树,在编译处理后,匹配到有其注解的类,那么注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。

下面只是介绍了几个常用的注解,更多的请参见https://projectlombok.org/features/index.html。

利用此原理,也可自行编写一些工作中一些经常使用到的,比如实体类转Map对象,map对象转实体类,原本使用Beanutils或者cglib的BeanCopier实现转换,前者使用的是反射的机制,所以性能相对较差,后者是使用修改字节码技术,性能在未使用Converter时基本等同于setget方法。但说白了还是麻烦,毕竟还需要缓存对象等做到复用等。而使用lombok的形式的话,一切都是自动的,性能基本是没有损失的,由于对AST不熟悉,之后有时间了可以进行插件编写下(去官网提过这个问题,官方回复说,不太符合lombok的使用场景,⊙﹏⊙‖∣,还是自己动手,风衣足食吧~)

@Getter / @Setter

  1. 下载 lombok.jar 包
  2. 运行lombok.jar包,会自动扫描系统的ide安装情况,点击Install/Update,即可。

可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。

图片 6image

@EqualsAndHashCode

  1. 不运行jar包情况下,可直接指定eclipse.ini文件,设置javaagent属性即可(第二种方法最后的效果也是这样的。):

默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。

图片 7image

@ToString

添加maven依赖

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

生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。

常用注解介绍

  1. @Getter / @Setter:可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。

  2. @EqualsAndHashCode :默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。 @ToString 生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。

  3. @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:无参构造器、部分参数构造器、全参构造器

  4. ** @Data:包含@ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,基本上使用这个注解就足够了。**

  5. @Budilder:可以进行Builder方式初始化。

  6. @Slf4j:等同于:private final Logger logger = LoggerFactory.getLogger(XXX.class);简直不能更爽了!一般上用在其他java类上

更多注解说明,可查看:

使用lombok

@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class Demo { String code; String name;}

等同于

public class Demo { String code; String name; public static DemoBuilder builder() { return new DemoBuilder(); } public String getCode() { return this.code; } public String getName() { return this.name; } public void setCode(String code) { this.code = code; } public void setName(String name) { this.name = name; } public boolean equals { if (o == this) return true; if (!(o instanceof Demo)) return false; Demo other =  o; if (!other.canEqual return false; Object this$code = getCode(); Object other$code = other.getCode(); if (this$code == null ? other$code != null : !this$code.equals(other$code)) return false; Object this$name = getName(); Object other$name = other.getName(); return this$name == null ? other$name == null : this$name.equals(other$name); } protected boolean canEqual(Object other) { return other instanceof Demo; } public int hashCode() { int PRIME = 59; int result = 1; Object $code = getCode(); result = result * 59   ($code == null ? 43 : $code.hashCode; Object $name = getName(); return result * 59   ($name == null ? 43 : $name.hashCode; } public String toString() { return "Demo(code="   getCode()   ", name="   getName"; } public Demo() { } public Demo(String code, String name) { this.code = code; this.name = name; } public static class DemoBuilder { private String code; private String name; public DemoBuilder code(String code) { this.code = code; return this; } public DemoBuilder name(String name) { this.name = name; return this; } public Demo build() { return new Demo(this.code, this.name); } public String toString() { return "Demo.DemoBuilder(code="   this.code   ", name="   this.name   ")"; } } }

使用@Slf4j

@Slf4jpublic class LogExampleOther { public static void main(String... args) { log.error("Something else is wrong here"); }}

常规的

public class LogExampleOther { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class); public static void main(String... args) { log.error("Something else is wrong here"); }}

省了多少事!!!少年快使用吧!

  • 个人QQ:499452441
  • 微信公众号:lqdevOps图片 8公众号

个人博客:

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。

@Data

@ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,我们使用这个注解就足够了。

一般都是@Data注解就够了

编辑:编程 本文来源:通过使用对应的注解,性能在未使用

关键词: 澳门新濠3559