【每天学个新注解】Day 2 Lombok注解简解(一)—@Data、@Build、@Value

@Data

相当于同时使用了 @Getter 、@Setter 、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode

1、如何使用

  • 需要同时使用@Getter 、@Setter 、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode注解一个Bean的时候。

2、代码示例

例:

@Data
public class People {
    private String name;
    private int age;
    private String sex;
}

@Builder

帮助我们简化 Builder 模式的实现过程
Builder模式(创建者模式):创建型设计模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,提供一种通过链式方法来创建一个复杂的对象。

1、如何使用

  • 注解在类上,会生成一个名为builder的静态方法以及各属性的链式设置方法,最后通过 build 方法来构建对象。
  • 在构造函数上使用 @Builder 注解,可以控制哪些字段需要在 builder 中出现。比如,我们可能有一个包含很多字段的类,但只希望部分字段可以通过 builder 来设置。
  • 字段在 builder 模式中有默认值,我们可以在构造函数中设置。

2、代码示例

例:

@Builder
@ToString
public class People {
    private String name;
    private int age;
    private String sex;
}

那么创建对象时就可以通过builder静态方法实现

public class Test {
    public static void main(String[] args) {
        People p = People.builder()
                .name("tom")
                .age(18)
                .sex("男")
                .build();
        System.out.printf(p.toString() + "\n");
    }
}

在这里插入图片描述
例:

@ToString
public class People {
    private String name;
    private int age;
    private String sex;

    @Builder
    public People(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = (sex==null)?"未知":sex;
    }
}		

那么创建对象时就可以通过builder静态方法实现

public class Test {
    public static void main(String[] args) {
        People p = People.builder()
                .name("tom")
                .age(18)
                .build();
        System.out.printf(p.toString() + "\n");
    }
}

当不设置sex的值时,可以通过默认值取到“未知”。
在这里插入图片描述

@Value

创建不可变类
不可变类的特点是它的状态在对象创建后不能被修改,这在多线程环境中尤其有用。

1、如何使用

  • 需要创建不可变类的时候,在类上添加该注解。
  • @Value 注解是 @Data 的不可变版本,自动生成所有字段的 getter 方法、toString 方法、equals 和 hashCode 方法,以及一个全参数的构造函数,并将所有字段设为 private 和 final。

2、代码示例

例:

@Value
public class People {
    private String name;
    private int age;
    private String sex;
}

编译后:

import lombok.Generated;

public final class People {
    private final String name;
    private final int age;
    private final String sex;

    @Generated
    public People(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Generated
    public String getName() {
        return this.name;
    }

    @Generated
    public int getAge() {
        return this.age;
    }

    @Generated
    public String getSex() {
        return this.sex;
    }

    @Generated
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof People)) {
            return false;
        } else {
            People other = (People)o;
            if (this.getAge() != other.getAge()) {
                return false;
            } else {
                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                Object this$sex = this.getSex();
                Object other$sex = other.getSex();
                if (this$sex == null) {
                    if (other$sex != null) {
                        return false;
                    }
                } else if (!this$sex.equals(other$sex)) {
                    return false;
                }

                return true;
            }
        }
    }

    @Generated
    public int hashCode() {
        int PRIME = true;
        int result = 1;
        int result = result * 59 + this.getAge();
        Object $name = this.getName();
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        Object $sex = this.getSex();
        result = result * 59 + ($sex == null ? 43 : $sex.hashCode());
        return result;
    }

    @Generated
    public String toString() {
        return "People(name=" + this.getName() + ", age=" + this.getAge() + ", sex=" + this.getSex() + ")";
    }
}
Lombok@Data注解不起作用可能有以下几个原因: 1. **Lombok插件未安装**:确保你的IDE(如IntelliJ IDEA或Eclipse)已经安装了Lombok插件。如果没有安装,插件市场搜索并安装Lombok插件。 2. **依赖未添加**:确保你的项目中已经添加了Lombok的依赖。如果你使用的是Maven,可以在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>最版本</version> <scope>provided</scope> </dependency> ``` 如果使用的是Gradle,可以在`build.gradle`中添加: ```groovy compileOnly 'org.projectlombok:lombok:最版本' annotationProcessor 'org.projectlombok:lombok:最版本' ``` 3. **注解未生效**:确保你的类上正确使用了`@Data`注解,并且没有其他配置或注解冲突。例如: ```java import lombok.Data; @Data public class User { private String name; private int age; } ``` 4. **编译问题**:有时候编译缓存可能会导致问题,尝试清理并重构建项目。例如,在IntelliJ IDEA中可以使用`Build -> Clean Project`然后`Build -> Rebuild Project`。 5. **版本不兼容**:确保Lombok版本与你的Java版本兼容。某些旧版本的Lombok可能不支持版本的Java。 6. **配置问题**:有些情况下,IDE的配置可能会影响Lombok的行为。确保在IDE的设置中没有禁用Lombok的相关功能。 通过检查以上几个方面,应该能够解决Lombok@Data注解不起作用的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值