【JAVA基础】lombok的@Data会生成什么?和无参构造器有关系吗

在这里插入图片描述

问题: 前提:实体中有三个属性;问题一、lombok在实体上如果只加@Data会生成哪些构造器。问题二
编译器默认生成无参构造器,如果自己写了有一个参数的构造器,还会生成默认的无参构造器吗 ?

问题一解答
当在Java实体类上只加@Data注解时,Lombok会为该实体类自动生成以下方法:

  • getter 方法:为类中的每个字段生成getter方法。
  • setter 方法:为类中的每个非final字段生成setter方法。
  • equals 方法:生成equals方法用于比较两个对象的等价性。
  • hashCode 方法:生成hashCode方法用于生成对象的哈希码。
  • toString 方法:生成toString方法,包含类中所有字段的字符串表示。

关于构造器:
无参构造器:@Data注解本身不直接生成构造器。但是,由于Java类的默认行为,如果你没有显式地定义任何构造器,Java编译器会自动为你生成一个无参构造器。然而,一旦你定义了任何构造器(无论是有参还是无参),编译器就不会再自动生成无参构造器,除非你自己显式地定义它。

因此,如果你只是简单地在实体类上加了@Data注解而没有定义任何构造器,那么Java编译器会为你生成一个无参构造器。但是,这个无参构造器的存在并不是因为@Data注解,而是Java语言本身的特性。

问题二解答
编译器默认生成无参构造器,但如果你自己写了有一个参数的构造器,那么编译器将不会再生成默认的无参构造器。这是Java语言的一个基本规则:一旦类中定义了至少一个构造器(无论是有参还是无参),编译器就不会再自动生成无参构造器。

如果你需要无参构造器,同时又想定义一个或多个有参构造器,你需要显式地在类中定义无参构造器。例如:

public class MyEntity {  
    private int id;  
    private String name;  
    private double value;  
  
    // 显式定义的无参构造器  
    public MyEntity() {  
    }  
  
    // 定义的有参构造器  
    public MyEntity(int id, String name) {  
        this.id = id;  
        this.name = name;  
        // 注意:这里的value字段没有被初始化,除非在类级别或通过其他构造器进行初始化  
    }  
  
    // 其他Lombok生成的getter、setter等省略...  
}

在这个例子中,即使我们定义了一个有参构造器,我们也显式地定义了一个无参构造器,以确保两者都存在;

@Data注解在JAVA被编译后生成 的hashCode 方法和toString 方法是什么样的
在Java中,当使用Lombok的@Data注解时,它会在编译时自动生成hashCode和toString方法。这些生成的方法的具体实现依赖于Lombok库的内部逻辑,但通常它们会遵循一些标准的Java实践。

hashCode 方法
生成的hashCode方法会考虑类中所有的字段(通常是所有非静态、非瞬态字段),并使用这些字段的值来计算一个哈希码。这个哈希码的计算方式可能依赖于字段的类型和值,但通常会尝试确保不同对象(即字段值不完全相同的对象)具有不同的哈希码,以减少哈希冲突的可能性。

Lombok生成的hashCode方法可能会使用Java的Objects.hash(Object…)方法(在Java 7及以上版本中可用)或类似的机制来组合多个字段的哈希码。

toString 方法
生成的toString方法同样会考虑类中所有的字段,并生成一个包含这些字段名称和值的字符串表示。字段值会转换为它们的字符串表示(通过调用toString方法,对于基本类型则通过包装类的方法,如Integer.toString(int))。

生成的字符串通常遵循"ClassName{fieldName=fieldValue, …}"的格式,其中ClassName是类的名称,fieldName是字段的名称,fieldValue是字段的字符串表示。

示例
假设你有一个简单的类,如下所示:

import lombok.Data;  
  
@Data  
public class Person {  
    private String name;  
    private int age;  
    private boolean employed;  
}

Lombok可能会在编译时生成类似于以下的hashCode和toString方法(注意:这只是一个概念性的示例,实际生成的代码可能会有所不同):

@Override  
public int hashCode() {  
    int prime = 31;  
    int result = 1;  
    result = prime * result + ((age == 0) ? 0 : age);  
    result = prime * result + ((employed == false) ? 0 : 1);  
    result = prime * result + ((name == null) ? 0 : name.hashCode());  
    return result;  
}  
  
@Override  
public String toString() {  
    return "Person{name='" + name + '\'' +  
           ", age=" + age +  
           ", employed=" + employed +  
           '}';  
}

实际的实现细节(如字段的排序和哈希码的计算方式)可能会因Lombok的版本和Java的版本而异。此外,如果类中有继承关系,Lombok生成的hashCode和toString方法可能需要额外的逻辑来处理父类字段。但是,上述是一个关于Lombok如何生成这些方法的基本形式

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执键行天涯

码你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值