四、Lombok 注解详解(2)

1,@Setter 和 @Getter

(1)这两个注解用于生成 setter 和 getter 方法,可以用在类或者属性上:
  • 如果用在属性上:则只为该属性提供 setter 和 getter 方法
  • 如果是用在类上:则为这个类所有属性供 setter 和 getter方法
 
(2)下面我们在一个类上添加 @Setter 和 @Getter 注解:
package com.example.demo;

import lombok.Getter;
import lombok.Setter; @Getter
@Setter
public class User {
private String name;
private Integer age;
}

(3)然后我们就可以直接使用它的 setter 和 getter 方法了:

User user = new User();
user.setName("hangge");
user.setAge(123);
user.getName();
user.getAge();

2,@Getter(lazy=true)

(1)该标注用于生成一个 lazy 版的 getter,它会在第一次调用这个 getter 时计算一次值,然后从那里开始缓存它。如果计算该值需要大量 CPU,或者该值占用大量内存,这可能很有用。
注意:Lombok 会自动去管理线程安全的问题,所以不会存在重复赋值的问题。
(2)要使用此功能,需要创建一个 private final 变量,并且使用运行成本高的表达式对其进行初始化,同时使用 @Getter(lazy=true) 注解进行标注。
 1 // 使用注解
2 public class GetterLazyExample {
3 @Getter(lazy=true) private final double[] cached = expensive();
4
5 private double[] expensive() {
6 double[] result = new double[1000000];
7 for (int i = 0; i < result.length; i++) {
8 result[i] = Math.asin(i);
9 }
10 return result;
11 }
12 }
13
14 // 不使用注解
15 public class GetterLazyExample {
16 private final java.util.concurrent.AtomicReference<java.lang.Object> cached =
17 new java.util.concurrent.AtomicReference<java.lang.Object>();
18
19 public double[] getCached() {
20 java.lang.Object value = this.cached.get();
21 if (value == null) {
22 synchronized(this.cached) {
23 value = this.cached.get();
24 if (value == null) {
25 final double[] actualValue = expensive();
26 value = actualValue == null ? this.cached : actualValue;
27 this.cached.set(value);
28 }
29 }
30 }
31 return (double[])(value == this.cached ? null : value);
32 }
33
34 private double[] expensive() {
35 double[] result = new double[1000000];
36 for (int i = 0; i < result.length; i++) {
37 result[i] = Math.asin(i);
38 }
39 return result;
40 }
41 }

3,@ToString

(1)@ToString 注解在类上, 为类提供 toString() 方法:

  • 默认情况下,它会按顺序(以逗号分隔)打印这个类名称以及每个字段。
  • 可以这样设置不包含哪些字段:@ToString(exclude = "id") 或者 @ToString(exclude = {"id","name"})
 1 package com.example.demo;
2
3 import lombok.Getter;
4 import lombok.Setter;
5 import lombok.ToString;
6
7 @Getter
8 @Setter
9 @ToString
10 public class User {
11 private String name;
12 private Integer age;
13 }

(2)下面是一个简单的测试样例:

1 User user = new User();
2 user.setName("hangge");
3 user.setAge(123);
4 System.out.println(user.toString());

 

4,@EqualsAndHashCode

(1)当其注解在类上,为该类提供 hashCode() 和 equals() 方法:
  • 默认情况下,它将使用所有非静态,非 transient 字段。
  • 可以通过在可选的 exclude 参数中来排除更多字段。
  • 也可以通过在 parameter 参数中命名它们来准确指定希望使用哪些字段。
 1 package com.amos.lombok;
2
3 import lombok.EqualsAndHashCode;
4
5 @EqualsAndHashCode
6 public class EqualsAndHashCodeExample {
7
8 private transient int transientVar = 10;
9 private String name;
10 private double score;
11
12 /**
13 * 不包含该字段
14 */
15 @EqualsAndHashCode.Exclude
16 private Shape shape = new Square(5, 10);
17 private String[] tags;
18
19 /**
20 * 不包含该字段
21 */
22 @EqualsAndHashCode.Exclude
23 private int id;
24
25 public String getName() {
26 return this.name;
27 }
28
29 @EqualsAndHashCode(callSuper = true)
30 public static class Square extends Shape {
31 private final int width, height;
32
33 public Square(int width, int height) {
34 this.width = width;
35 this.height = height;
36 }
37 }
38
39 public static class Shape {
40 }
41 }

(2)上面编译后会变成如下代码:

  1 package com.amos.lombok;
2
3 import java.util.Arrays;
4
5 public class EqualsAndHashCodeExample {
6 private transient int transientVar = 10;
7 private String name;
8 private double score;
9 private EqualsAndHashCodeExample.Shape shape = new EqualsAndHashCodeExample.Square(5, 10);
10 private String[] tags;
11 private int id;
12
13 public EqualsAndHashCodeExample() {
14 }
15
16 public String getName() {
17 return this.name;
18 }
19
20 public boolean equals(final Object o) {
21 if (o == this) {
22 return true;
23 } else if (!(o instanceof EqualsAndHashCodeExample)) {
24 return false;
25 } else {
26 EqualsAndHashCodeExample other = (EqualsAndHashCodeExample)o;
27 if (!other.canEqual(this)) {
28 return false;
29 } else {
30 label31: {
31 Object this$name = this.getName();
32 Object other$name = other.getName();
33 if (this$name == null) {
34 if (other$name == null) {
35 break label31;
36 }
37 } else if (this$name.equals(other$name)) {
38 break label31;
39 }
40
41 return false;
42 }
43
44 if (Double.compare(this.score, other.score) != 0) {
45 return false;
46 } else {
47 return Arrays.deepEquals(this.tags, other.tags);
48 }
49 }
50 }
51 }
52
53 protected boolean canEqual(final Object other) {
54 return other instanceof EqualsAndHashCodeExample;
55 }
56
57 public int hashCode() {
58 int PRIME = true;
59 int result = 1;
60 Object $name = this.getName();
61 int result = result * 59 + ($name == null ? 43 : $name.hashCode());
62 long $score = Double.doubleToLongBits(this.score);
63 result = result * 59 + (int)($score >>> 32 ^ $score);
64 result = result * 59 + Arrays.deepHashCode(this.tags);
65 return result;
66 }
67
68 public static class Shape {
69 public Shape() {
70 }
71 }
72
73 public static class Square extends EqualsAndHashCodeExample.Shape {
74 private final int width;
75 private final int height;
76
77 public Square(int width, int height) {
78 this.width = width;
79 this.height = height;
80 }
81
82 public boolean equals(final Object o) {
83 if (o == this) {
84 return true;
85 } else if (!(o instanceof EqualsAndHashCodeExample.Square)) {
86 return false;
87 } else {
88 EqualsAndHashCodeExample.Square other = (EqualsAndHashCodeExample.Square)o;
89 if (!other.canEqual(this)) {
90 return false;
91 } else if (!super.equals(o)) {
92 return false;
93 } else if (this.width != other.width) {
94 return false;
95 } else {
96 return this.height == other.height;
97 }
98 }
99 }
100
101 protected boolean canEqual(final Object other) {
102 return other instanceof EqualsAndHashCodeExample.Square;
103 }
104
105 public int hashCode() {
106 int PRIME = true;
107 int result = super.hashCode();
108 result = result * 59 + this.width;
109 result = result * 59 + this.height;
110 return result;
111 }
112 }
113 }

SpringBoot - Lombok使用详解2(@Setter、@Getter、@ToString、@EqualsAndHashCode)的更多相关文章

  1. Lombok使用详解(转)

    本文转自https://blog.csdn.net/u010695794/article/details/70441432 2017年04月22日 15:17:00 阅读数:10394 Lombok使 ...

  2. Lombok 使用详解,简化Java编程

    前言 在 Java 应用程序中存在许多重复相似的.生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求 比如,在 Java 应用程序开发中,我们几乎要为所有 ...

  3. Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  4. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...

  5. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

  6. Spring全家桶——SpringBoot之AOP详解

    Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方 ...

  7. Springboot mini - Solon详解(四)- Solon的事务传播机制

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  8. Springboot mini - Solon详解(二)- Solon的核心

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  9. Springboot mini - Solon详解(三)- Solon的web开发

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  10. Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

随机推荐

  1. Element--->>>最新骨架屏Skeleton使用

    首先,Element在最近的一次更新中(时间:2021-06-29) 新增了Skeleton骨架屏组件.Empty空状态组件. 那么在使用其自带组件Skeleton时,应将按照如下步骤使用: Ⅰ:如果 ...

  2. matlab画图之plot画折线图

    Matlab绘制折线图 使用plot(x,y)函数创建折线图时,x,y有以下要求: ①如果 X 和 Y 都是向量,则它们的长度必须相同.plot 函数绘制 Y 对 X 的图. ②如果 X 和 Y 均为 ...

  3. R7-7 调查电视节目受欢迎程度

    R7-7 调查电视节目受欢迎程度 分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 某电视台要调查观众对该台8个栏目(设相应栏目编号为1~8)的受欢迎情况,共调查了n位观众(1≤n≤ ...

  4. react video

    import React, { useRef, useState, useCallback } from 'react'; import './style.scss'; const typeCheck ...

  5. .net基础—委托和事件

    委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 在实例化委托时,可以将其实例与任何具有兼容签名和返回类型的方法相关联. 可以通过委托实例调用方法.可以将任何可访问类或结构中与 ...

  6. Dockerfile 参考

    Dockerfile:FROM openjdk:8u252-jdkENV JHIPSTER_SLEEP=0 \ JAVA_OPTS="" \ LOGFILE="" ...

  7. 一、Java简单概述

    一 . Java组成部分 JDK : java development kit (Java开发工具) JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也 包括了JRE. 所以安装了 ...

  8. bcc分析缓存命中率

    系统环境:centos7/redhat7 安装,提前配好网络yum源,比如aliyun yum install bcc-tools /etc/profile 添加如下命令路径 vim /etc/pro ...

  9. mac中Mysql各种版本下载

    https://downloads.mysql.com/archives/community/ 安装后,5.8以下修改密码,参考 https://www.cnblogs.com/xuyin/p/121 ...

  10. Typora怎么让左边的标题折叠

    点击文件选择偏好设置->在选择外观->选中侧边栏的大纲视图允许折叠和展开 效果