Kotlin data class 重写getter setter处理,支持Parcelable的intent传递和Gson解析
2018-02-24 17:21
2863 查看
一、 前言
Kotlin的data class是不支持直接get和set的,于是有些需要修改实体参数的需求就做不了。在百度或谷歌搜索到的其他文章,有说是定义一个新的属性在内部,但是这样子并不适合我们在项目中使用。
二、 例子
价格的处理:服务器要求价格的单位是分,但是移动端显示和填写的时候需要单位为元,这个时候需要我们在实体类的进行分和元的转换处理。一个商品实体类
data class Goods( var name: String, var price: Int //价格,服务器要求单位是分 )
我们显示的时候需要变成元,这时候需要改造实体类,在内部重新定义属性,重写get方法:
data class Goods( var name: String, var _price: Int //价格,服务器要求单位是分 ){ //在内部重新定义属性,重写get方法 var price: Float = 0F get(){ return field / 100 } }
这个时候往你项目里面一放,问题就出来了: 从服务器获取数据之后,价格一直是0
因为解析的时候,price属性在内部Gson是解析赋值不了的,所以,我们需要指定解析属性,添加注解
@SerializedName, 这样子的话,gson解析出来的实体类就有数据了
data class Goods( var name: String, var _price: Int //价格,服务器要求单位是分 ){ //添加注解,让gson解析赋值 @SerializedName("price") var price: Float = 0F get(){ return field / 100 } }
然后,问题又来了: 实体类需要activity之间传递,需要用到Parcelable,这里要注意,在write的时候,需要乘以100 ,为什么呢? 因为get的时候已经除以100了。 这个时候 传递到下个activity的价格_price就是服务器的价格,但是注意了,price会是0,为什么呢, 因为没传递,所以需要赋值_price的价格到price
data class Goods( var name: String, var _price: Int //价格,服务器要求单位是分 ){ //添加注解,让gson解析赋值 @SerializedName("price") var price: Float = 0F get(){ var realValue = field if (realValue == 0F) { realValue = _price //实体类传递到了其他Activity,赋值回来 } return realValue / 100 } override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) { writeString(name) writeInt(price * 100) //注意这里需要恢复服务器的数据 } ... }
相关文章推荐
- Json转换利器Gson之实例五-实际开发中的特殊需求处理(手动解析-TypeToken)
- Gson解析之字段名和实体类属性名不一致的处理
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- kotlin dataBinding 不支持
- Gson解析或者转换对象成json字符串时,String为NULL转空字符串处理方案
- Kotlin Reference (八) 可见性修饰符, data class,object Claz
- Kotlin教程学习-dataclass,objectclass,use函数,类扩展,socket
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- 安卓开发传递对象:当Parcelable序列化对象用Intent传递发生闪屏或者值不对应时
- Intent传递Parcelable List对象
- Android Intent传递对象 Serializable & Parcelable
- android studio 解析Excel数据格式导入poi-3.17.jar时的一系列报错及处理Failed resolution of: Ljavax/xml/stream/XMLEventFactory,duplicate entry: org/apache/xmlbeans/xml/stream/Location.class,GC overhead limit exceeded
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
- Intent传递对象——Serializable和Parcelable差别
- (六十四)Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- 使用 Intent传递对象(Parcelable方式)
- Intent之对象传递(Parcelable传递对象和对象集合)
- Intent 传递对象 Serializable/Parcelable