四、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. PyTables学习 (数据保存形式,对象树结构)

    参考自http://www.pytables.org/usersguide/introduction.html PyTables的主要目的是提供一个好的操作HDF5文件的方法. HDF文件是分层数据格 ...

  2. Linux的stat命令结果说明

    There are 3 kind of "timestamps": Access - the last time the file was read Modify - the la ...

  3. jmeter-时间处理

    ${__time(,)} 1486091280955 //无格式化参数,返回当前毫秒时间,默认13位.一般用来做时间戳 ${__time(/1000,)} //为取10位的时间戳的函数表达式(时间精确 ...

  4. DELL服务器基于centos7安装OMSA

    DELL服务器基于centos7安装OMSA 参考链接: https://www.cnblogs.com/sky-cheng/p/14951071.html https://www.dell.com/ ...

  5. 记一次mysql5.7保存Emoji表情

    1.错误:SQLException; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x90\x96 \ ...

  6. python装饰器中高级用法(函数加参)

    在上一章我们说到装饰器的原则和基本用法,下面来补充一下:如果函数加参,装饰器该如何变化 1,还是用上一章的源代码 2,给test2加个参数name 报错了,本来给test2加一个name参数,为了实现 ...

  7. fastadmin打包插件

    <?php namespace app\command; use think\console\Command; use think\console\Input; use think\consol ...

  8. 项目启动报错:关于modals以及node版本相关

    programme1: 1.代码用master分支的. 2. 删除node_module ,  yarn lock 文件,package-lock文件. 3. 用 npm install 或者 yar ...

  9. 打卡node day07--图片上传,身份验证

    multer 模块  github:https://github.com/fanlina157/nodePro npm i multer fileRouter.js var express = req ...

  10. 5分钟上手使用vuex,vuex状态管理,vuex遇到的坑

    很多刚学习vue的人对于全局变量管理工具vuex都觉得很神秘,今天就用很通俗的大白话协助大家理解一下vuex,作者的vue项目使用vue脚手架搭建的,用脚手架搭建的项目会在src文件夹下有一个stor ...