Kotlin data class 遇到的坑及解决方案

前言

最近开始重构,Javabean也想全部替换成kotlin的data class,可data class使用有诸多限制,并没有Javabean使用的那么随心所欲。在此也记录下遇到的坑吧。

坑1:没有无参构造器

data class 没有无参构造器,创建此类至少要有一个参数。造成的不变就在于如果想手动创建数据,就要将所有的参数都赋值一遍。没有JavaBean直接通过无参构造器创建对象来的方便。

解决办法:虽然网上有很多的方式,包括使用什么插件,引入什么依赖,但有众多的限制,依然是不能随意的创建无参的data class实体类。如果使用data class的话,就不用想无参构造器创建了,可以使用替代的方式来减少繁琐。比如,data class 有 copy()方法,可以直接copy出一个与原对象相同数据的对象,也可以传递某些参数来动态更改其数据。

        val demo = DemoBean("hhh","男")

        val copy = demo.copy()
        val copy1 = demo.copy(name = "111")
        val copy2 = demo.copy(sex = "女")
        val copy3 = demo.copy(name = "222", sex = "嬲")

这样多少也减少了些工作量吧。

坑2 非空字段

在Javabean中,不存在什么非空字段,无非就是数据没有返回,调用的时候是空而已,只需要在代码中判断非空就行。而使用data class就要在书写的时候加非空判断。比如:

data class DemoBean(val name: String, val sex: String)

这样写,通过json转换来的字段必须包含 namesex,值可以为空,但必须得有这俩字段,否则转换不过来。
比如json为:

{"name":"11","sex","男"}

这样可以直接转换,但如果json是

{"name":"222"}  或者 {"sex","女"}

这样有缺省字段的情况下是无法转换成data class的。

解决办法1:所有字段都加非空判断?
将data class改成这样

data class DemoBean(val name: String?, val sex: String?)

允许字段为空,json缺省状态下依然可以使用,但带来的不便就是使用字段的时候都需要加判空标识符?,其实也挺麻烦的。
解决办法2:约束api数据返回

代码层次上无法像javabean那么随心所欲的情况下,就直接从源头上解决问题吧。跟后台定好协议,文档上有的字段,必须全部返回,即便没有数据,也要返回空字段。这样带来的问题就是后续api接口数据字段只能增不能减,扩展性稍微差点。不过以我这么多年的工作经验来看,减字段优化接口还不如重新写一个接口更方便,减少线上出问题的风险。

坑3 复用性问题

从坑2里延伸来的问题,如果几个接口返回的数据很类似,有公共数据字段,各自还有各自独立的属性字段,在javabean中可以抽离出公共字段到基类,然后各自继承基类就可以实现复用。
但kotlin的data class也想类似javabean那种抽离出公共字段到一个data class,子类再继承使用就会出很大的问题。虽然data class可以继承,但是可继承的类有限,可以继承abstract修饰的抽象类,可以继承sealed修饰的密封类,像同为data class的数据类以及普通的不修饰的类,都无法继承。

解决办法1:不复用(废话),全字段写到对应的data class中。

解决办法2:放弃data class,写普通的kotlin类来封装数据,可以跟javabean一样,解决复用问题

解决办法3:使用abstract修饰的抽象类来封装公共数据字段,各自data class继承此抽象类。

解决办法4:把所有的字段都放到同一个data class中,其中公共字段不需要添加非空判断,其余独立字段均加上非空判断,可以正常解析使用。

坑4 kotlin的反射依赖

项目中使用的fastJson,需要配合kotlin反射依赖才能顺利解析。
"org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" 匹配好自己的kotlin版本即可。
添加混淆配置:

-keepattributes *Annotation*
-keep class kotlin.** { *; }
-keep class org.jetbrains.** { *; }

必加的依赖,否则一堆问题。

终极解决方案

出现上述问题的主要原因是用了fastjson,但如果换成Gson,上述的解析方面的问题就都不是问题了。无论字段是否缺省,无论是否配置kt的反射依赖,gson都可以完美的适配data class。少年,不想那么操蛋的配置,就换gson吧。

尾声

目前遇到这些坑,先记录下来,等以后还遇到什么问题,再补充吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容