03.Lombok-@ToString注解

783 阅读3分钟

Java Bean 对象为什么要重写toString方法?

答:

  • List或其他集合调试不方便
  • 控制台或日志输出对象,默认打印的是内存地址

我们在初学Java基础或者考Java二级考试的时候经常会出这么一道题:

UserDao.java

package com.lzh.dao;

import lombok.Getter;
import lombok.Setter;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.dao
 * @Project:1024shop-manager
 * @name:UserDao
 * @Date:2023/3/29 下午7:44
 * @Filename:UserDao
 * @Description:UserDao
 * @Version:1.0
 */
@Setter
@Getter
public class UserDao {
    private int id;
    private String name;
    private int age;
}

UserDaoTest.java

package com.lzh;

import com.lzh.dao.UserDao;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh
 * @Project:1024shop-manager
 * @name:UserDaoTest
 * @Date:2023/3/29 下午7:45
 * @Filename:UserDaoTest
 * @Description:UserDaoTest类,帮助我们打印出userDao对象
 * @Version:1.0
 */
@Slf4j
public class UserDaoTest {

    @Test
    public void test() {
        log.info("方法开始被调用...");
        UserDao userDao = new UserDao();
        userDao.setId(1);
        userDao.setName("kaiyang");
        userDao.setAge(18);
        System.out.println(userDao);
        log.info("方法调用结束");

    }
}

问你打印的结果是什么 ?

Result:

19:48:28.920 [main] INFO com.lzh.UserDaoTest - 方法开始被调用...
com.lzh.dao.UserDao@400cff1a
19:48:28.923 [main] INFO com.lzh.UserDaoTest - 方法调用结束

我们可以看到,我们new了一个UserDao的实例,准确的说法是声明并实例化对象。然后将实例化后的对象显示的声明出来,起了一个变量的名称userDao,返回的类型是UserDao。

// 声明并实例化对象
UserDao userDao = new UserDao();

我们在控制台打印userDao变量发现是一个地址!!!! 这是在初学者的眼中很不能理解的事情。

我们想要打印出userDao的对象里的属性就必须要重写toString方法。

然后我们赶紧在 UserDao 类中重写toString方法:

package com.lzh.dao;

import lombok.Getter;
import lombok.Setter;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.dao
 * @Project:1024shop-manager
 * @name:UserDao
 * @Date:2023/3/29 下午7:44
 * @Filename:UserDao
 * @Description:UserDao
 * @Version:1.0
 */
@Setter
@Getter
public class UserDao {
    private int id;
    private String name;
    private int age;

    @Override
    public String toString() {
        return "UserDao{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}
package com.lzh;

import com.lzh.dao.UserDao;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh
 * @Project:1024shop-manager
 * @name:UserDaoTest
 * @Date:2023/3/29 下午7:45
 * @Filename:UserDaoTest
 * @Description:UserDaoTest类,帮助我们打印出userDao对象
 * @Version:1.0
 */
@Slf4j
public class UserDaoTest {

    @Test
    public void test() {
        log.info("方法开始被调用...");
        UserDao userDao = new UserDao();
        userDao.setId(1);
        userDao.setName("kaiyang");
        userDao.setAge(18);
        System.out.println(userDao);
        log.info("方法调用结束");
    }
}

Result:

19:57:08.873 [main] INFO com.lzh.UserDaoTest - 方法开始被调用...
UserDao{id=1, name='kaiyang', age=18}
19:57:08.876 [main] INFO com.lzh.UserDaoTest - 方法调用结束

我们重写toString方法,虽然可以使用idea的快捷键,但是我们的Lombok也可以通过注解的方式完成toString的重写,接下来我们一起来看一下@ToString 注解。

@ToString 注解

  • @ToString作用于类,默认重写toString方法
package com.lzh.dao;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.dao
 * @Project:1024shop-manager
 * @name:UserDao
 * @Date:2023/3/29 下午7:44
 * @Filename:UserDao
 * @Description:UserDao
 * @Version:1.0
 */
@Setter
@Getter
@ToString
public class UserDao {
    private int id;
    private String name;
    private int age;

}
package com.lzh;

import com.lzh.dao.UserDao;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh
 * @Project:1024shop-manager
 * @name:UserDaoTest
 * @Date:2023/3/29 下午7:45
 * @Filename:UserDaoTest
 * @Description:UserDaoTest类,帮助我们打印出userDao对象
 * @Version:1.0
 */
@Slf4j
public class UserDaoTest {

    @Test
    public void test() {
        log.info("方法开始被调用...");
        UserDao userDao = new UserDao();
        userDao.setId(1);
        userDao.setName("kaiyang");
        userDao.setAge(18);
        System.out.println(userDao);
        log.info("方法调用结束");
    }
}

Result:

20:14:22.346 [main] INFO com.lzh.UserDaoTest - 方法开始被调用...
UserDao(id=1, name=kaiyang, age=18)
20:14:22.349 [main] INFO com.lzh.UserDaoTest - 方法调用结束

mvn compile 编译后的字节码文件:

image.png

看到了么? 我们的lombok的@ToString方法,帮我们自动重写了toString方法。

使用@ToString 注解重写toString方法时,自定义输出对象的信息

不包括某个字段

@ToString(exclude={"age"})

只输出某个字段

@ToString(of={"age"})

只输出某个字段例子:

package com.lzh.dao;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.dao
 * @Project:1024shop-manager
 * @name:UserDao
 * @Date:2023/3/29 下午7:44
 * @Filename:UserDao
 * @Description:UserDao
 * @Version:1.0
 */
@Setter
@Getter
@ToString(of="name")
public class UserDao {
    private int id;
    private String name;
    private int age;

}

image.png

不包括某个字段例子:

package com.lzh.dao;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.dao
 * @Project:1024shop-manager
 * @name:UserDao
 * @Date:2023/3/29 下午7:44
 * @Filename:UserDao
 * @Description:UserDao
 * @Version:1.0
 */
@Setter
@Getter
@ToString(exclude = "age")
public class UserDao {
    private int id;
    private String name;
    private int age;

}

image.png

这期就到这里,我们下期再见。