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 编译后的字节码文件:
看到了么? 我们的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;
}
不包括某个字段例子:
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;
}
这期就到这里,我们下期再见。