栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

lombok隐含的坑点——对布尔数据类型的属性读取方法的特殊处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

lombok隐含的坑点——对布尔数据类型的属性读取方法的特殊处理

lombok是一个几乎必备的辅助插件,通过使用它的注解,可以在编译阶段自动生成我们需要的代码,如最常用的属性的getter和setter方法。

这里有个特殊的点需要注意下,对于布尔数据类型的属性,插件有其自身的特殊处理方式,而不是跟其他基本数据类型一样生成getXXX和setXXX方法。

例如下面这个全局配置类中,我们定义了一个控制消息是否重发的布尔类型属性enableResend

@Data
@ConfigurationProperties(prefix = "params")
public class MessageClientGlobalHolder
{

	
	private Channel channel = null;

	
	private  String appCode;
	
	private  String appSecret;
	
	private  String host;
	
	private  int port=8997;

	
	private  int heartbeatRate=5;

	
	private  int sendMessageSpan=30;

	
	private  boolean enableResend;

	
	private String webSocketPath;


	
	private int readIdleTimeOut;

	
	public String getWebSocketUrl() {
		String url= MessageFormat.format("ws://{0}:{1}/{2}",this.getHost(),String.valueOf(this.getPort()),
				this.getWebSocketPath());
		return url;

	}



}

当我们要读取其属性时,会发现,相应的对象上,并没有getEnableResend()这个方法,反而是isEnableResend()的方法,为什么会这样呢?

原来是lombok插件内部针对布尔类型做了一些额外的逻辑处理,具体规则为:

1.读取属性的方法默认生成规则是is+属性名而不是get+属性名,即isEnableResend而不是getEnableResend
2.假如属性名自身以is开头,如isEnableResend,则获取属性的方法依旧是isEnableResend,而不是别扭的isIsEnableResend
3.以上两条规则,会出现一种因为不合理导致的极端情况,即有两个属性,一个名字是isEnableResend,另一个是enableResend,这里本质上是设计存在问题,对于这种情况,插件的处理方式是只生成一个isEnableResend,至于读取的是哪个属性,取决于属性的顺序,居前者优先。

需要注意的问题还有几个:
1.以上的处理规则,实际都是指使用基本布尔类型boolean,而不是包装类型Boolean,对于包装类型,lombok插件依旧是get+属性名的规则,不做额外处理。
2.对于写入属性的方法,依旧是set+属性名,没有额外处理。

这个地方的特殊性,表面看起来很简单,只是一个小坑而已,即使开发时遇到了,只是错愕一下,翻翻方法列表,就能找到对应的方法,或者进一步百度下,就能找到为什么方法名不是预期的getXXX。

但是,这里面有一个更大的隐含的坑,就是lombok进一步和其他组件组合使用,则有可能会发生问题,例如对象创建、反序列化,对象属性的拷贝,如果这些功能组件底层是使用反射去寻找对应的get属性,则很可能会找不到合适的方法,导致属性丢失或异常,比如将一个true值变成了false,需要特别注意。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715966.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号