首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

lombok生成getter、setter的小圈套

2012-08-24 
lombok生成getter、setter的小陷阱最近做项目使用lombok生成getter和setter,代码如下:以下代码为示例代码:i

lombok生成getter、setter的小陷阱
最近做项目使用lombok生成getter和setter,代码如下:

以下代码为示例代码:

import lombok.Setter;import lombok.Getter;@Getter@Setterpublic class Member {private String name;private long id;private int age;private boolean isLeader;@Overridepublic String toString() { //方便打印结果return "Member [name=" + name + ", id=" + id + ", age=" + age+ ", isLeader=" + isLeader + "]";}}


使用jackson,测试代码如下:
import org.codehaus.jackson.map.ObjectMapper;public class JsonTest {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();Member m = mapper.readValue("{"name":"jack","id":234902348,"age":25,"isLeader":false}", mapper.constructType(Member.class));System.out.println(m);}}


结果将json数据转换成这个对象时出现问题,错误信息如下:
Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "isLeader" (Class Member), not marked as ignorable

提示说isLeader这个property没有找到,但是明明是存在的。这时想到转换对象时,是通过setter将值set给每一个property的,会不会是因为setter不对导致找到property呢?查看一下生成setter,果然发现问题,如下图:



property的名称是isLeader,根据规则,生成的setter应该是setIsLeader(),但是实际却是setLeader(),问题应该就出在这里了,那么修改下Member的代码,来验证下我们的猜测,如下:

import lombok.Setter;import lombok.Getter;@Getter@Setterpublic class Member {private String name;private long id;private int age;private boolean isLeader;public void setIsLeader(boolean isLeader) { //补充一个setterthis.isLeader = isLeader;}@Overridepublic String toString() {return "Member [name=" + name + ", id=" + id + ", age=" + age+ ", isLeader=" + isLeader + "]";}}


重新运行测试,问题不再出现,和猜测一样,是由于生成setter不规范导致的。

既然setter生成的不规范,那么getter是不是也是呢?如下图:



果然getter也是一样,并不是getIsLeader(),而是isLeader()。

最后,我们看看eclipse自动生成的getter和setter是什么样呢?

public class Member {private String name;private long id;private int age;private boolean isLeader;public boolean isLeader() {return isLeader;}public void setLeader(boolean isLeader) {this.isLeader = isLeader;}@Overridepublic String toString() {return "Member [name=" + name + ", id=" + id + ", age=" + age+ ", isLeader=" + isLeader + "]";}}


可见eclipse生成的getter、setter和lombok是一样的,但是eclipse生成的代码是显示的,可以看见,而lombok生成就不容易发现了。

最后说一下boolean型生成getter和setter的问题,如果boolean型property的名称是hello,b生成getter和setter的格式是isHello()和getHello(),如果名称是isHello,生成的还是isHello()和getHello(),这个是sun的规范,但是目前很多框架在使用getter和setter时并不是这样的,而是setHello ()或者setIsHello(),所以编码时一定要小心。

热点排行