java基础(小技巧)
文章目录
- 一、日志输出
- 二、字符串拼接
- 三、日期比较
- 四、常用注解
- 五、Lombok的原理
提示:以下是本篇文章正文内容,下面案例可供参考
一、日志输出
之前使用的方式。在要使用的类里面定义日志类:
private static Logger logger = LoggerFactory.getLogger(“xxx”);
现在使用方式:
### pom.xml配置文件引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
使用方式:
在要使用的类上添加注解@Slf4j
想输出日志,直接使用log.info
或log.error
即可,不在需要定义日志类
(和之前使用日志输出一样)。示例代码如下。
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class T1 {
public static void main(String[] args) {
MyObject obj = new MyObject("example", 42);
String jsonString = JSONObject.toJSONString(obj);//将对象转为jsonObject
System.out.println(jsonString);
log.info("输出日志信息:"+jsonString);
log.error("输出日志信息:"+jsonString);
}
static class MyObject {
private String name;
private int value;
public MyObject(String name, int value) {
this.name = name;
this.value = value;
}
// Getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
}
二、字符串拼接
使用方式:String.format("%s|%s|%s", s1, s2, s3)
.以|
作为连接
Object s1="A1";
Object s2="B2";
Object s3="C3";
String stringDeal = String.format("%s|%s|%s", s1, s2, s3);
System.out.println("据输出:"+stringDeal);
据输出:A1|B2|C3
三、日期比较
isAfter 和 isBefore 是 java.util.Date 类中的两个方法,用于比较两个日期对象。
-
isAfter
(Date when):
isAfter 方法用于检查调用该方法的日期对象是否在指定日期参数 when 之后。如果调用对象的日期晚于参数日期,则返回 true;否则返回 false。 -
isBefore
(Date when):
isBefore 方法用于检查调用该方法的日期对象是否在指定日期参数 when 之前。如果调用对象的日期早于参数日期,则返回 true;否则返回 false。
import java.util.Date;
public class DateComparison {
public static void main(String[] args) {
Date now = new Date(); // 当前日期和时间
Date tomorrow = new Date(now.getTime() + 86400000); // 假设明天的日期
// 检查现在是否在明天之后
System.out.println("Is now after tomorrow? " + now.isAfter(tomorrow));
// 检查现在是否在明天之前
System.out.println("Is now before tomorrow? " + now.isBefore(tomorrow));
// 检查明天是否在现在之后
System.out.println("Is tomorrow after now? " + tomorrow.isAfter(now));
// 检查明天是否在现在之前
System.out.println("Is tomorrow before now? " + tomorrow.isBefore(now));
}
}
输出:
Is now after tomorrow? false
Is now before tomorrow? true
Is tomorrow after now? true
Is tomorrow before now? false
四、常用注解
@Data注解是一个综合性的注解,它可以为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等。例如:
注解 | 功能 |
---|---|
@Getter | 为属性生成getter方法 |
@Setter | 为属性生成setter方法 |
@NoArgsConstructor | 为类生成无参构造器 |
@RequiredArgsConstructor | 为类生成包含所有final或@NonNull属性作为参数的构造器 |
@AllArgsConstructor | 为类生成包含所有属性作为参数的构造器 |
@Data | 为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等 |
@Builder | 为类生成一个构建器(builder)模式,让你可以用链式调用的方式创建对象 |
@Slf4j | 为这个类生成一个名为log的日志变量,使用org.slf4j.Logger作为日志框架。让可以方便地打印日志信息 |
@SneakyThrows | 让你在方法中抛出受检异常(checked exception),而不需要在方法签名中声明或者使用try-catch语句 |
@Value | 为类生成一个不可变(immutable)的对象,即所有属性都是final的,并且只有getter方法,没有setter方法 |
@Accessor | 为属性生成自定义的访问方法,让你可以控制方法的名称、修饰符、参数等等 |
@With | 为属性生成一个返回一个新对象的方法,让你可以用不可变(immutable)的方式修改对象的属性 |
@Singular | 为集合属性生成一个构建器(builder)模式,让你可以用链式调用的方式添加元素 |
@NonNull | 为方法或构造器的参数添加非空检查,如果参数为null,抛出NullPointerException |
@Cleanup | 为需要关闭的资源自动调用close方法,避免资源泄漏 |
@Synchronized | 为方法添加同步锁,避免多线程问题 |
@EqualsAndHashCode | 为类生成equals和hashCode方法,根据属性的值判断对象是否相等 |
@ToString | 为类生成toString方法,返回对象的字符串表示 |
@Delegate | 为类生成委托(delegate)方法,让你可以调用另一个对象的方法,而不需要自己编写 |
@Val | 表示一个不可变的局部变量,相当于使用final修饰符 |
@Var | 表示一个可变的局部变量,相当于省略了类型声明 |
举几个常用例子:
- @Data 常用
@Data注解是一个综合性的注解,它可以为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等。例如:
import lombok.Data;
@Data
public class User {
private String name;
private int age;
}
这段代码相当于:
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
可以看到,使用@Data注解可以大大减少你的代码量,让你的类更简洁和清晰。当然,如果你不想生成所有的方法,你也可以使用其他的注解来选择性地生成你需要的方法。
五、Lombok的原理
Lombok利用了Java的注解处理器(Annotation Processor)机制,它可以在编译时扫描和处理注解,并生成额外的Java代码。Lombok通过实现一个自定义的注解处理器,来拦截和修改抽象语法树(AST),从而在类中添加相应的方法,字段,构造器等。Lombok还提供了一个插件,可以让IDE在编辑时也能识别和显示Lombok生成的代码,从而避免编译错误和提示信息的不一致。
Lombok的原理可以用以下几个步骤来概括:
- 定义一个注解,比如@Getter,用来标记需要生成getter方法的类或字段。
- 定义一个注解处理器,比如GetterProcessor,用来处理@Getter注解,并在类中生成相应的getter方法。
- 在注解处理器中,使用Lombok提供的API,比如JavacAST,JavacHandlerUtil等,来获取和修改AST。
- 在编译时,使用javac或者其他工具(比如maven,gradle等)来调用注解处理器,并传入源代码。
- 注解处理器扫描源代码中的注解,并根据注解的参数和目标来生成相应的代码,并添加到AST中。
- 编译器根据修改后的AST来生成字节码文件(.class文件)。
参考:参考Lombok
- 总结: Lombok是一个非常实用的Java库,它可以让我们的代码更加简洁,可读,健壮。Lombok有很多优点,但也有一些缺点,比如可能会影响代码的调试,测试,维护等。因此,在使用Lombok时,我们需要权衡利弊,根据自己的需求和喜好来选择合适的注解和配置。