kotlin中数据类重写setter getter的正确方法

概述

在开发过程中,经常会创建一些数据里,其没有任何逻辑功能,仅仅来用来保存数据。在Kolin中,将这些类统一称为数据类,用关键字data标记。

data class User(val name: String, val age: Int)

编译器会根据主构造器中声明的全部属性, 自动推断产生以下成员函数:

  • equals()/hashCode()函数对,
  • toString() 函数, 输出格式为 “User(name=John, age=42)” ,
  • componentN() 函数群, 这些函数与类的属性对应, 函数名中的数字 1 到 N, 与属性的声明顺序一致,
  • copy() 函数

如果在该数据类或者基类中重写了以上某个成员函数,将不会再自动推断,以重写的为准。

前言

kotlin的数据类,由于其内部封装了getter和setter方法,极大地简化了我们的编程代码,但同时其不能像java那样方便的重写getter或者setter方法,也给大家造成了一定的麻烦。

举个例子:

data class OrderBean(val createTime: Long)

后端返回的订单数据中,createTime这个字段是长整型的时间戳,但是前端需要转成yyyy-MM-dd这种格式,或者yyyy年MM月dd日这种,再或者更加友好一点,根据时间段,转成1小时前、2天前、一周前这种,在实际开发中都是常有的情况,在Java中我们可以很方便的在getter方法中做这些处理,但是kotlin的getter方法都是内部封装的,并不直接支持重写,我看到网上有些答案是像这样处理的:

data class OrderBean(val _createTime: Long){
 val createTime:String
 get() = { ...do something }
}

这样处理其实并没有真正改变createTime的值,反而会造成一些更大的麻烦,比如,数据类中自动生成的equals(),toString()等一些方法还是会沿用长整型的值,而且当你做某些值对比的时候,会产生一些不可预测的结果。

正确的姿势

有以下三种,你可以根据自己的业务逻辑和团队的话语权进行选择:

  • 让后端改:如果有可能的话,这是最合理,最恰当的方式,后端直接返回我们需要的字段形式,节省了移动端,web端,小程序端等每端各写一套逻辑的时间,并且万一哪段比较坑,实现出来的时间跟你们不一样,可能你们每个都要复查一遍。另外,后端写的话,一旦需求变更,后端处理起来要更加简单方便。
  • 不用data class,使用常规的class:不要拘泥于建议,谁说这些数据实体类就必须要用data class的,使用IDE去自动生成,照样可以,而且还实现了自己的完全控制。
  • 另外创建一个安全的变量:如果在团队中实在人微言轻,有非要用data class,那就去另外创建一个变量,比如:
data class OrderBean(val createTime: Long){
 val createTimeShow:String
  get() = { ...do something }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Kotlin基础教程之伴生对象,getter,setter,内部,局部,匿名类,可变参数

    先来看一个名为Message的类 在这个类中有一段包含在companion object中的代码,需要说一下的是,Kotlin的class并不支持static变量,所以需要使用companion object来声明static变量,其实这个platformStatic变量也不是真正的static变量,而是一个伴生对象, 这个伴生对象位于Message类中定义的一个叫做Companion的内部类中,如图: 可以看到在Kotlin中编译器自动生成类是很常见的事情,那么这个伴生对象作何理解呢? 我的理

  • kotlin中数据类重写setter getter的正确方法

    概述 在开发过程中,经常会创建一些数据里,其没有任何逻辑功能,仅仅来用来保存数据.在Kolin中,将这些类统一称为数据类,用关键字data标记. data class User(val name: String, val age: Int) 编译器会根据主构造器中声明的全部属性, 自动推断产生以下成员函数: equals()/hashCode()函数对, toString() 函数, 输出格式为 "User(name=John, age=42)" , componentN() 函数群,

  • Kotlin中实体类的创建方式

    类的基本格式 class 类名{ } 属性的基本格式 var 属性名字 : 类型 下面是实体类代码 package com.dldw.entity import java.util.* class Demo { //var 声明的属性可以被二次赋值 val声明的是不可变属性,赋值以后不能在赋值,否则编译报错 //长整型 64位 注意后面加大写L var height: Long? = 0L //整型 32 位 var id : Int?= 0 //短整型 16位 var short :Short

  • Java中Thread类详解及常用的方法

    目录 一.Thread 的常见构造方法 二.Thread 的常见属性 三.创建线程 四.中断线程 五.线程等待 六.获取线程引用 七.线程休眠 八.线程状态 总结 一.Thread 的常见构造方法 方法 说明 Thread() 创建线程对象 Thread(Runnable target) 使用 Runnable 对象创建线程对象 Thread(String name) 创建线程对象并命名 Thread(Runnable target,String name) 使用 Runnable 对象创建线程

  • C#中枚举类型和radiobox关联操作的方法

    本文实例讲述了C#中枚举类型和radiobox关联操作的方法.分享给大家供大家参考.具体分析如下: 有了enum我们可以列举类型了,有了单选框和复选框我们可以鼠标来选择了.但是编程的时候觉得让两个关联起来,写代码比较麻烦,所以想自动的关联起来.所以我尝试了一下,记录如下. 假如一个星期的enum: public enum 星期 { 星期一 = 0, 星期二, 星期三, 星期四, 星期五, 星期六, 星期天 } 关联到7个RadioButton,也就是单选框. 第一步在enum中定义星期一=0:

  • window.location.href中url中数据量太大时的解决方法

    先说一下今天遇到的问题 一个导出excel的处理,在按钮按下后需要传很大一个数据到后台,刚开始的做法如下: 复制代码 代码如下: var actionUrlSetData = "****Action!exportDatas.action"+ "?now=" + new Date().getTime();window.location.href= actionUrl + "&" + data; 上面的data就是一个很长的字符串. 这样在火

  • javascript中String类的subString()方法和slice()方法

    在该书2.8.4节中讲到String类中的subString()方法和slice()方法,其用法和返回结果都基本相同,如下示例: 复制代码 代码如下: var strObj = new String("hello world"); alert(strObj.slice(3)); // 输出结果:"ol world" alert(strObj.subString(3)); // 输出结果:"ol world" alert(strObj.slice(

  • java中实体类转Json的2种方法

    首先申明所需jar包: ezmorph-1.0.6.jar jackson-all-1.7.6.jar jsoup-1.5.2.jar 一.创建一个实体类Emp. package com.hyx.entity; public class Emp { private Integer id; private String name; private Integer dptNo; private String gender; private String duty; public Integer ge

  • 查找页面中所有类为test的结点的方法

    前言 阿里巴巴,web前端实习生要在线考试了.确实对于菜鸟的我还是恶补一下知识先.所以百度谷歌了之前阿里巴巴校招的前端笔试题,觉得自己真的被鄙视了,完全做不懂的.啊里巴巴的web前端是在线的笔试,是不是给我们百度谷歌的机会呢? 看见这道题目的时候,觉得确实自己应该去封装一些你常用的方法,就像jquery那样.做出一些方法,是实现浏览器兼容的,或者是工具类,确实对以后开发还是有利的. HTML 为了方便说明,我们先写下HTML 复制代码 代码如下: <p class="A B"&g

  • Android Kotlin全面详细类使用语法学习指南

    目录 前言 1. 类的声明 & 实例化 2. 构造函数 2.1 主构造函数 2.2 次构造函数 3. 类的属性 4. 可见性修饰符 5. 继承 & 重写 6. 特殊类 6.1 嵌套类(内部类) 6.2 接口 6.3 数据类 6.4 枚举类 总结 前言 Kotlin被Google官方认为是Android开发的一级编程语言 今天,我将主要讲解kotlin中的类的所有知识,主要内容包括如下: 1. 类的声明 & 实例化 // 格式 class 类名(参数名1:参数类型,参数名2:参数类型

  • 老生常谈ES6中的类

    前面的话 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中引入了类的特性.本文将详细介绍ES6中的类 ES5近似结构 在ES5中没有类的概念,最相近的思路是创建一个自定义类型:首先创建一个构造函数,然后定义另一个方法并赋值给构造函数的原型 function PersonType(name) { this.name = name; } Person

随机推荐