Enjoy 对于 boolean 类型的属性,自动生成的getter前缀时is,而Enjoy总是找get开始的

1、对于 boolean 类型的属性,eclipse自动生成的getter前缀时is,而Enjoy总是找get开始的

2、对于属性名是^[a-z]{1}[A-Z]{1}[a-zA-Z0-9\$]*$ 这种正则模式,例如:eBook 生成的getter是geteBook  而不是 getEBook



评论区

JFinal

2018-05-18 19:43

碰到这种情况直接调用方法就好:
obj.geteBook()
obj.isXxx()

enjoy 这样设计的原因是为了提升性能,如果设计成支持 isXxx() 方法的 obj.xxx 形式取值,那么就要在 getXxx() 方法找不到时再找一次 isXxx() 方法,这个会显著拉低性能

但凡是考虑性能的框架都会考虑这里,例如 fastjson 就不支持 isXxx() 来生成 json

此外, eclipse 生成器会为 eBook 属性生成 geteBook() 方法,这个是 bug,需要你手动改掉,如果不改的话,可以在 enjoy 直接调用这个方法: obj.geteBook()

obj.isXxx 以及 geteBook 这类情况是很少发生的,为照顾少数场景而拉低整体性能是不值得的。让这类场景去使用 obj.isXxx()、obj.geteBook() 来实现功能是权衡后的结果

fastjson 甚至阿里巴巴的 Java 规范手册上压根就直接规定 boolean 属性的 getter 方法不能是 isXxx(), 必须是 getXxx()

这是一个好问题,点赞

jimchow

2018-05-19 18:36

@JFinal 是这样的,我是通过某种途径拿到的一个map,map里面存储有所有的属性名,我只能通过属性名取读,而不知道其getter方法名,其属性修饰符也是private,没法修改其源码。虽然这个问题我可以手动干预,但我也是建议。

另外,阿里规范是这样写的:
8. 【强制】POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。

反例:定义为基本数据类型boolean isSuccess;的属性,它的方法也是isSuccess(),RPC

我的理解是属性名不要用is开头,而不是方法名,布尔型的getter方法名是isXx,这是javabean规范

JFinal

2018-05-20 16:41

@jimchow isXx 确实是 java bean 规范,但 java 规范中很多并不好,例如 EJB 这类。

因此,对于 isXx 属性的处理, enjoy 仅仅是对 obj.xx 表达式默认去找 getXx() 方法而不是 isXx() 方法

而对于方法名的命名,enjoy 完全不干预,也不在意,例如你完全可以将方法名设置为 isXx() ,只不过在使用 enjoy 表达式的时候用一下 obj.isXx()

JFinal

2018-05-20 16:43

所以,这里讨论的焦点并不在于如何针对 boolean 型属性生成的方法名如何命名,是命名成 isXx() 还是命名成 getXx()

而这个命名的选择 enjoy 本身并不在意,只是 enjoy 在获取这个属性时换个写法:obj.isXx()

热门反馈

扫码入社