七、Lombok注解详解(5)

12,@log

(1)该注解用在类上,可以省去从日志工厂生成日志对象这一步,直接进行日志记录,具体注解根据日志工具的不同而不同。不同的日志注解总结如下(上面是注解,下面是实际作用):
我们也可以在注解中使用 topic 来指定生成 log 对象时的类名。
 1 @CommonsLog
2 private static final org.apache.commons.logging.Log log =
3 org.apache.commons.logging.LogFactory.getLog(LogExample.class);
4
5 @JBossLog
6 private static final org.jboss.logging.Logger log =
7 org.jboss.logging.Logger.getLogger(LogExample.class);
8
9 @Log
10 private static final java.util.logging.Logger log =
11 java.util.logging.Logger.getLogger(LogExample.class.getName());
12
13 @Log4j
14 private static final org.apache.log4j.Logger log =
15 org.apache.log4j.Logger.getLogger(LogExample.class);
16
17 @Log4j2
18 private static final org.apache.logging.log4j.Logger log =
19 org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
20
21 @Slf4j
22 private static final org.slf4j.Logger log =
23 org.slf4j.LoggerFactory.getLogger(LogExample.class);
24
25 @XSlf4j
26 private static final org.slf4j.ext.XLogger log =
27 org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
(2)下面是一个简单的使用样例:
 1 // 使用注解
2 @Log
3 public class LogExample {
4 public static void main(String... args) {
5 log.error("Something's wrong here");
6 }
7 }
8
9 // 不使用注解
10 public class LogExample {
11 private static final java.util.logging.Logger log =
12 java.util.logging.Logger.getLogger(LogExample.class.getName());
13
14 public static void main(String... args) {
15 log.error("Something's wrong here");
16 }
17 }

13,@Buinder

(1)builder 是现在比较推崇的一种构建值对象的方式。该描述符用于将类改造成 builder(建造者)模式,用在类、方法或者构造函数上。
 1 package com.example.demo;
2
3 import lombok.Builder;
4 import lombok.Singular;
5
6 import java.util.Set;
7
8 @Builder
9 public class BuilderExample {
10 private String name;
11 private int age;
12 @Singular
13 private Set<String> occupations;
14 }

(2)上面相当于如下传统的 Java 代码:

 1 package com.example.demo;
2
3 import java.util.Collection;
4 import java.util.Set;
5
6 public class BuilderExample {
7 private String name;
8 private int age;
9 private Set<String> occupations;
10
11 BuilderExample(String name, int age, Set<String> occupations) {
12 this.name = name;
13 this.age = age;
14 this.occupations = occupations;
15 }
16
17 public static BuilderExampleBuilder builder() {
18 return new BuilderExampleBuilder();
19 }
20
21 public static class BuilderExampleBuilder {
22 private String name;
23 private int age;
24 private java.util.ArrayList<String> occupations;
25
26 BuilderExampleBuilder() {
27 }
28
29 public BuilderExampleBuilder name(String name) {
30 this.name = name;
31 return this;
32 }
33
34 public BuilderExampleBuilder age(int age) {
35 this.age = age;
36 return this;
37 }
38
39 public BuilderExampleBuilder occupation(String occupation) {
40 if (this.occupations == null) {
41 this.occupations = new java.util.ArrayList<String>();
42 }
43
44 this.occupations.add(occupation);
45 return this;
46 }
47
48 public BuilderExampleBuilder occupations(Collection<? extends String> occupations) {
49 if (this.occupations == null) {
50 this.occupations = new java.util.ArrayList<String>();
51 }
52
53 this.occupations.addAll(occupations);
54 return this;
55 }
56
57 public BuilderExampleBuilder clearOccupations() {
58 if (this.occupations != null) {
59 this.occupations.clear();
60 }
61
62 return this;
63 }
64
65 public BuilderExample build() {
66 //complicated switch statement to produce a compact properly sized immutable set omitted
67 // go to https://projectlombok.org/features/Singular-snippet.html to see it.
68 Set<String> occupations = ...;
69 return new BuilderExample(name, age, occupations);
70 }
71
72 @java.lang.Override
73 public String toString() {
74 return "BuilderExample.BuilderExampleBuilder(name = " + this.name + ", age = "
75 + this.age + ", occupations = " + this.occupations + ")";
76 }
77 }
78 }

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

1 BuilderExample be = BuilderExample.builder()
2 .name("hangge")
3 .age(123)
4 .occupation("ABC")
5 .occupation("DEF")
6 .build();
7
8 return be.toString();

14,@SneakyThrows

(1)该注解用在方法上,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出。
(2)也可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常。
 1 // 使用注解
2 public class SneakyThrows implements Runnable {
3 @SneakyThrows(UnsupportedEncodingException.class)
4 public String utf8ToString(byte[] bytes) {
5 return new String(bytes, "UTF-8");
6 }
7
8 @SneakyThrows
9 public void run() {
10 throw new Throwable();
11 }
12 }
13
14 // 不使用注解
15 public class SneakyThrows implements Runnable {
16 public String utf8ToString(byte[] bytes) {
17 try{
18 return new String(bytes, "UTF-8");
19 }catch(UnsupportedEncodingException uee){
20 throw Lombok.sneakyThrow(uee);
21 }
22 }
23
24 public void run() {
25 try{
26 throw new Throwable();
27 }catch(Throwable t){
28 throw Lombok.sneakyThrow(t);
29 }
30 }
31 }

15,@Synchronized

该注解用在类方法或者实例方法上,效果和 synchronized 关键字相同,区别在于锁对象不同。对于类方法和实例方法,它俩区别在于:

  • synchronized 关键字的锁对象分别是“类的 class 对象”和“this 对象”
  • @Synchronized 的锁对象分别是“私有静态 final 对象 lock”和“私有 final 对象 lock”。当然,也可以自己指定锁对象。
 1 // 使用注解
2 public class Synchronized {
3 private final Object readLock = new Object();
4
5 @Synchronized
6 public static void hello() {
7 System.out.println("world");
8 }
9
10 @Synchronized
11 public int answerToLife() {
12 return 42;
13 }
14
15 @Synchronized("readLock")
16 public void foo() {
17 System.out.println("bar");
18 }
19 }
20
21 // 不使用注解
22 public class Synchronized {
23 private static final Object $LOCK = new Object[0];
24 private final Object $lock = new Object[0];
25 private final Object readLock = new Object();
26
27 public static void hello() {
28 synchronized($LOCK) {
29 System.out.println("world");
30 }
31 }
32
33 public int answerToLife() {
34 synchronized($lock) {
35 return 42;
36 }
37 }
38
39 public void foo() {
40 synchronized(readLock) {
41 System.out.println("bar");
42 }
43 }
44 }

SpringBoot - Lombok使用详解5(@log、@Buinder、@SneakyThrows、@Synchronized)的更多相关文章

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

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

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

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

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

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

  4. Springboot mini - Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

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

  5. Lombok使用详解(转)

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. idea插件Tranlation配置有道搜索引擎

    idea配置有道翻译引擎 一.更换翻译引擎原因 由于Google在2022年9月末宣布关闭GoogleTranslate在中国的服务,原本在chrome浏览器和idea上使用的google翻译引擎也不 ...

  2. R语言回归、anova方差分析、相关性分析 《精品购物指南》调研数据可视化|附代码数据

    全文链接:http://tecdat.cn/?p=30990 最近我们被客户要求撰写关于回归.anova方差分析.相关性分析的研究报告,包括一些图形和统计输出. 在分析时,我们向客户演示了用R语言回归 ...

  3. CAD坐标显示不全怎么办?CAD坐标常见问题解答!

    今天小编来和大家聊一下浩辰CAD看图王中关于CAD坐标的那些事,比如:CAD坐标为何显示不全?CAD坐标显示结果和之前不一样?以及不能精准捕捉CAD坐标等情况,应该如何轻松解决?今天就和小编一起来了解 ...

  4. python使用SAP GUI操作SAP的几个坑

    1) 首先必须设定SAP中设置可以使用SAP GUI Script. 详细参见以下文章: https://blog.csdn.net/weixin_44447687/article/details/1 ...

  5. unity笔记001

    熟悉场景和物体的基本操作,q移动场景,e旋转物体,放大缩小,V键顶点吸附,相比快捷键,还是喜欢用xyz参数控制

  6. SQL_SERVER 2000启动问题

    SQL Server evaluation period has expired解决办法 问题现象: 本地计算机 上的 MSSQLSERVER 服务启动后又停止了.一些服务自动停止,如果它们没有什么可 ...

  7. 学习Anaconda,jupyter notebook

    20200210,理解了jupyter在anaconda中的意义,vs code觉得对我这个初学者来讲,更容易使用,pycharm虽然破解安装了,但是感觉不太好用,随后再说 20200211, jup ...

  8. centos linux 忘记密码

    1.开机 esc 将画面停止 2.   e 进入设置状态 3.编辑修改两处:ro改为rw,在LANG=en_US.UFT-8后面添加init=/bin/sh,版本不同 内容不同,找到对应的位置修改 4 ...

  9. FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 工业图像输出 图像模拟源

    FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 一.板卡概述       FMC板卡包含1路HD-SDI 输入输出,1路复合视频输入输出,用于高清.标清相机的产品测试及智 ...

  10. Huawei-2488H-V5服务器基础配置与系统安装

    0x00 前言简述 描述: 由于最近公司来了一批华为的服务器以及存储,来的时候真的感到非常意外因为从中标到接货超过了1个半月,其间还因为各种事进行推延: 在现场实施人员完成服务器上架以及测试后,由于业 ...