我为什么不喜欢lombok,这个问题大家怎么看,高级分析技巧

作者: 极海Channel分类: 计算机技术 发布时间: 2023-09-04 16:47:03 浏览:57665 次

我为什么不喜欢lombok,这个问题大家怎么看,高级分析技巧

火连山:
这个咋说呢,你只要用了别人的工具,就肯定会碰到一些逻辑是出乎意料的。lombook那个逻辑明显就是正常字段转驼峰的逻辑。我反倒会把这个问题规到jackson上。当时也是找bug看过jackson源码,我是觉得挺难看的,尤其json解析那部分逻辑。至于视频中的问题我也遇到过,不过我当时倒是没纠结,因为平时都用的好好的,而且我也意识到aName这个名称如果自动转set方法那个方法名是有点反常的。不管是setAName还是setaName其实都不好看。所以当时我第一反应就是看了bean反编译后的代码。但是我解决这个问题确实花了很多功夫因为我觉得lombook的生成符合我的预期,是jackson解析不对,所以为了找这个原因看jackson源码弄了半天。最后记得是给bean加了个jackson的注解显示声明的对应关系。

【回复】也可以说是变量起的不规范吧,Jackson那里为什么通过方法去填充属性很奇怪,后面我再去看看注释[思考]
【回复】回复 @极海Channel :当时想找官网没找到,或者说我不确定是不是官网,想找官方文档也不确定。为了图省事,也没去下源码,印象中直接靠idea反编译追的,好像也没注释。实话实说正因为架构不了解,注释不了解,所以看代码的难度更大了…
【回复】回复 @极海Channel :effective Java第三版,16条可以解释为什么使用方法。因为通过方法访问数据对于面向对象来说,可以增加灵活性。所以这里使用方法填充数值我认为是合理的,设计上没有缺陷
知看不言:
才入行的时候,踩过lombok的坑,实体用的lombok生成,用easyExcel写表格,有个bug,有20列数据需要写入表格,总是只有前几列有值,后几列都为空,找了半天问题,后来换成setget就好了,从今以后我就没用过lombok

【回复】回复 @极海Channel :才入行的时候,很菜啥也不知道,各种找问题,一度怀疑人生,怀疑数据问题,怀疑easyExcel问题,还在easyExcel社区发帖问了,还问了公司大佬,就是没怀疑lombok有坑,它辜负了我的信任[藏狐][藏狐][藏狐]
【回复】回复 @极海Channel : idea旁边有个接口按钮,点开后就可以看到Lombok生成的结果,一些奇怪命名自己看就觉得有问题的我都会拉开看一眼,不过确实被坑过,就是那个布尔的is印象深刻[笑哭]
【回复】只能说明你命名不规范。只要规范化根本不会出现这种情况。这不是什么致命问题。并不是人家有bug。
墨水有鱼:
盲猜肯定是get/set方法生成规则和框架序列化时调用的get/set方法规则不一致,比如,导致你发现这个问题概率最大的字段→pId[doge]

【回复】回复 @极海Channel :变量名称对计算机来说没有任何意义,运行的时候用到的只是偏移量,任何会因为命名导致bug的基础组件我觉得都是有问题的[笑哭],起码它不够基础[doge]。 能用约束是最好的,涉及到命名就只能用约定,就好比劳动合同,大概看几眼就够了,谁会去一个字一个字的去扣啊,反正我不会[脸红]
【回复】还有boolean类型的isxxx[doge]
【回复】回复 @极海Channel : Lombok 是用的java bean 的规范把
毕THU:
[妙啊]好像配置一下 Lombok 就可以了,实测有效

【回复】我看到有配置,但是懒得研究了,感觉像dance on shit mountain[妙啊]
【回复】回复 @极海Channel : 就像楼上说的lombok默认名称映射才是符合规范的,jackson才是屎山
【回复】回复 @极海Channel :你这个评价极品了
TimsCao:
1. 这个例子里,我认为 Lombok 生成的 getter/setter 命名规则是没问题的,有问题的反而是 Jackson(或者说是两者对getter/setter命名规范不一致) 2. Jackson 序列化反序列化其实只认 public的setter/getter 和 public字段 的,不认private字段。可以试着写一个类,没有字段、只有getter/setter方法,然后用Jaskson序列化一下看看结果[吃瓜]

【回复】确实,我的项目里有这个,凭空多了个字段
【回复】第一个addField貌似添加进去了[妙啊]那个remove没细看了,有点离谱
Aaaaaaa阿i:
我觉得,享受了框架的便捷性,也得接收它黑盒所带来的未知性。我觉得这种未知是可以通过自己学习去克服的。当然框架工具也在升级。重点是结合自己当下和使用习惯,做到权衡利弊。总体来说我还是很喜欢lombok的[呲牙]

【回复】回复 @极海Channel :放sdk也没问题吧,你用gradle的话,implemeation 忘记那个作用域了,是可以阻断jar包依赖传递,或者直接使用jdk9之后的模块化
【回复】很多直接放sdk里捆绑包[doge]
【回复】回复 @极海Channel :这就是sdk开发者所需要思考的问题[doge]
多弗哥123:
我觉得其实还好,本质上还是各个框架关于驼峰规则不一致的问题。其实Spring、MyBatis、JPA、redistemplate也有坑啊,而且lombok也不只这一个坑,你知道它是什么问题、下次注意、或者有更好的最佳实践去平替就好了,本身你的注意力还是要更多放在业务实现(胶水代码)和架构优化方面(开会battle)麽 [藏狐] 油腻了喂 至于早些年前,不让用lombok和BeanUtils主要是出于手动的代码检查、只是减轻了些许体力活但增加了不可控因素,我其实都还好。除非坑多到受不了,否则也是怎么快速怎么来,这不产品经理/项目经理/测试经理在后面拿着刀等着呢 [无语]

【回复】搞不懂getter setter一个在JAVA里面使用强度这么大的东西,居然没有个标准规范,搞的各家框架和工具居然用tmd根据命名惯例猜测的方式映射字段及其对应的getter/setter方法,这是何等的卧槽。
【回复】Java就是封装太多了,比如你在序列化的时候就看你方法定义,但是这东西都是可以设置的。作为程序员基本素质就是发现问题解决问题。
【回复】[妙啊]这只是我不喜欢lombok的一个原因吧,这种问题其实挺烦的,真就潜规则了
superZemo:
虽然我也很抵触lombok,但这个问题不是反序列化的bug吗?lombok首字母大写转驼峰没毛病呀,而且应该用精准的getter/setter注解,@Data 注解太粗暴了

【回复】首字母大写驼峰是一般情况下下,但是首字母小写紧跟一个大写的情况下不是这样的,因为这样无法正常逆向转换,比如一个变量aName,还有一个变量AName,按照正常驼峰规则的setter方法都是setAName,但是jackson的这种方法就避免了这种情况的发生,aName的setter方法是setaName,AName的方法是AName
【回复】[妙啊]lombok和idea没商量好
【回复】a_name 这种会好些吧,get set is 都有很多坑,取名字是已经很困难的事[笑哭]
搞笑管理局:
JavaBean规范中要求属性以小写字母开头,且遵守驼峰命名格式,相应的 getter/setter 方法是 get/set 接上首字母大写的属性名。、例如:属性名为userName,其对应的getter/setter 方法是 getUserName/setUserName。 但是,还有一些特殊情况: 1、如果属性名是boolean 类型,如 属性名为 success ,则getter方式其实为isSuccess();如果是Boolean包装类型,则为getSuccess(); 2、如果属性名属性名是boolean 类型,以isXXX开头,如isSuccess,则getter方法并不是isIsXXX(),而还是isSuccess();如果是Boolean包装类型,则为getSuccess(); 3、如果属性名的第二个字母大写,如属性名为uName,方法是getuName()/setuName()。 4、如果属性名的前两个字母是大写,如属性名为URL,方法是getURL()/setURL(); 5、如果属性名的首字母大写,如属性名为Name,方法是getName()/setName() 以上第2 3 5 三种方式的命名都是不规范的,使用lombok等自动代码生成工具时,有可能不是按照以上规范来生成导致BUG产生

【回复】分三种程序员: 1.书上没写的,踩坑中学到了。 2.知道有部分约束规则,也只是知道。 3.知道是lombok原因,熟练的让人心疼。 这就是成长[妙啊]
【回复】回复 @极海Channel :遇到过第二种坑(同事写的)
【回复】试了一下4,发请求接收到的URL是null
甲壳羊:
我是在外企做的,外企对这些描述很少会命名aName这种,a在这里一般都是缩写吧?名字没有巨长,就应该写全的,所以驼峰写法,比如alphaName。其实视频最后生成的setter和getter也提示拼写问题,因为语法setaName, seta不是一个单词对吧? 综上所述,这是命名基本规范偷懒所导致的,只是lombok藏起来了。 个人愚见[doge]

【回复】回复 @极海Channel :哇塞,吓到我了,我就是个小弟,您是大佬[微笑]
【回复】[思考]大佬说的很有道理
空调吹夏被:
其实和lombok没关系,和序列化及set方法有关系。具体什么关系没深入研究。但是不用lombok,直接用set/get正确设置属性方法命名也很麻烦,xXxxxxxxXx这种属性(第一个字母小写第二个字母大写剩下的无所谓)都一样。

牛奶君:
提个小建议,ide整体是黑色风格的,另一个工具是白色的,切换的时候亮度变化太大,而且中间还有几次快速切换,对眼睛的刺激真的很大,观看起来特别不舒服

【回复】回复 @极海Channel :其实自己使用时也应该避免这种突然的亮度激增刺激眼睛比较好[妙啊]
JayYeChou:
发现lombok(减少代码量,实在是优雅) 使用lombok(相见恨晚) 出现bug(有坑快跑,谁用我揍谁) 再次相遇(上来就开喷)

【回复】get set不用它不就行了吗,用来输出日志我觉得这个还是挺方便的。
学java的基尔兽:
绝大多数框架都是方法优先于属性的,你就算没有属性,只要你有get set方法 他就认为你有 这个其实算是通用常识吧 起码我觉得是

【回复】我建议直接点不用封装了。
不想努力的南筱哟:
对于Lombok产生的问题 我反而更愿意接受它带来的便利性 利用一些注解 可以省去我手动的去创建构造函数写Autowired 但是要我说 java不太适合这种语法糖 Lombok是妥协的方案 不如直接使用kotlin 语法糖拉满

【回复】回复 @不想努力的南筱哟 :我试了一下c#,dotnet croe6和springboot3 这套基本一模一样,也是mvc,也有自动注入、切面和注解,也能编译为原生可执行程序,但c#有asnyc/await,写异步可比java优雅多了,集成开发环境用rider(idea 变种),不愧是巨硬[笑哭]
【回复】回复 @沅虹之月 :kotlin对Java程序员很友好的 不过考虑groovy了的话 我会选择转平台用c#了
【回复】回复 @极海Channel :海哥不如评价一期jdk的版本迭代越来越像新颖的编程语言靠齐了 模板字符串 协程 record类 等等语法糖优化[doge]
Mikesya:
lombok有时候还会在开发的时候出现找不到符号,后面排查下是IDEA缓存问题,以及没建立索引它就找不到对应方法,但是我还是会用,我个人比较强迫症,不想看到一堆getter/setter跟swagger注解一样像狗皮膏药,实在不行字段名称修改了。现在遇到个跟这个有点像的问题是MyBatis在update时候,查询字段太多了,有些字段就丢了,去掉不必要的字段,字段又有了

【回复】[滑稽]不知道新版jdk的record有没有这个问题
【回复】[doge][doge][doge]找不到方法真是体验很差
浮华乱红尘丶:
给大佬dd,基本每期都看,但是几乎不评论[doge],也不三连[doge]

【回复】回复 @极海Channel :有没有可能,这是老黑粉了[doge][doge][doge]
雨天替你撑伞:
还有布尔类型的变量,原始类型getter方法是isXXX(), 包装类型则是getXXX(), 如果你的变量名是is开头的,有的框架会帮你忽略掉重复的is,有的是isIsXXX(),还有的getIsXXX()。

【回复】还有一个原因,是java的get方法不是双射,例如同为bool类型的xxx和isXXX,生成的get方法均为isXXX。但是一般bool类型变量定义都是习惯is开头的,除了java特殊,应该是历史遗留问题。
【回复】[doge]避免起布尔变量为is开头,很对代码规范里都提到了,但是原因没说[吃瓜]
【回复】回复 @极海Channel :不用is开头命名的规范已经过时了,正因为Boolean类型的isXx属性在lombok生成后的get放法一定是getIsXx,反而在json序列化没有问题,踩坑基本也是不懂原理又也不遵守规范来的。如果遵守bean不用基础类型boolean,命名也不能用单字母缩写这种偷懒方式,就不会踩坑,这反而倒逼大家遵守规范[脱单doge]
水橋こむぎ:
看着一层层跳进去的源码方法,人都要昏古七了[笑哭]工具本质还是为了方便生产,但是代码这种产品还是太特殊了,差之毫厘,找bug挠光头皮。我估摸着做工具的人都没想到会在反序列化的时候出现这种bug[笑哭]

【回复】回复 @极海Channel :GPT可以给个大致思路,落地代码是万万不敢交给GPT的。现在AI最主要的实际应用还是用来跑搭好的训练模型,没有模型AI终究是个空壳。实际业务场景千变万化,GPT应对不来的[doge]
【回复】所以你们还用GPT写代码,排查的时间不如自己写了[妙啊]
【回复】回复 @极海Channel : 反正我这种菜鸟不敢用,哪里错的,哪里对的,我都未必分得清。只会徒增学习成本

计算机 开发 编程 大厂 MVC 源码 互联网 Java Spring json

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!