Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 对象和伴生对象的区别及测试方法_Kotlin - Fatal编程技术网

Kotlin 对象和伴生对象的区别及测试方法

Kotlin 对象和伴生对象的区别及测试方法,kotlin,Kotlin,我有一个数据类PersonRecord。但是我从API接收到的数据有不同的形式,我需要对其进行处理以提取A 第一种解决方案包括创建一个数据类PersonForm,以表示API数据,然后创建一个独立函数,该函数将classPersonForm的实例作为参数,并返回classPersonRecord的实例 查看一些stackoverflow帖子,我还发现了以下解决方案: 二, 数据类PersonRecord(val name:String,val age:Int,val tel:String){ 对

我有一个数据类
PersonRecord
。但是我从API接收到的数据有不同的形式,我需要对其进行处理以提取A

  • 第一种解决方案包括创建一个数据类
    PersonForm
    ,以表示API数据,然后创建一个独立函数,该函数将class
    PersonForm
    的实例作为参数,并返回class
    PersonRecord
    的实例
  • 查看一些stackoverflow帖子,我还发现了以下解决方案:

    二,

    数据类PersonRecord(val name:String,val age:Int,val tel:String){
    对象模型映射器{
    乐趣来自(形式:PersonForm)=
    PersonRecord(form.firstName+form.lastName、form.age、form.tel)
    }
    }
    
  • 与两个相同,但使用同伴对象而不是对象
  • 有没有更惯用/高效/自然的方法等?在哪种情况下,每一种都是首选的?


    谢谢。

    最惯用/自然的方法是创建二级构造函数:

    数据类PersonRecord(val name:String,val age:Int,val tel:String){
    构造函数(form:PersonForm):这个(form.firstName+form.lastName、form.age、form.tel)
    }
    
    这只是偏好的问题。2将要求您的使用站点非常详细。选项4是编写名为
    toPersonRecord()
    的PersonForm扩展函数。简洁易用。对于代码组织来说,作为扩展函数的状态比将其作为成员函数或同伴或内部对象的一部分更有意义,因为它处理的是另一个类的细节。选项3显然比选项2更好(不管
    PersonRecord
    实例的数量有多大,这个内部对象只有一个实例)。另外,更惯用的说法是将它称为
    ,而不是
    。@Tenfour04建议的选项4也很好(注意,它是这些类之间的反向依赖)。我想这个方法有一些局限性。如果我必须做一些更高级的计算(而不仅仅是串接字符串),它将填充得不那么自然。对吗?你可以在构造函数委托调用中调用任何可访问的函数:
    constructor(form:PersonForm):This(f(form.firstName,form.lastName),form.age,form.tel)
    。因此,您可以将高级计算的逻辑提取到私有文件本地函数或伴随对象方法中。如果您需要进行更复杂的计算(多个参数的值之间存在某种依赖关系,传递到另一个构造函数中),则选择选项1;也是非常惯用的方法(但是请注意,它不是java互操作友好的)当然,这个问题的答案是意见。我在评论中没有提到第五个选项,因为它在类之间创建了更紧密的耦合,因此不如选项1(当然是我的意见)。必须了解这两个类的所有信息的代码现在位于其中一个类中。这两种方法都没什么大不了的,因为使用IDE快捷方式,它不会影响代码维护的难度。我不认为我会将此称为惯用方法,因为我遇到的标准库类都不是这样设计的。它们的设计类似于opt我的评论中的第四条。@Tenfour04您介意详细说明“类之间更紧密的耦合?为什么不好?选项4.如何防止这种耦合?此外,是否有一些库可以推荐,我可以从中学习Kotlin的一些设计原则?感谢分享^ ^在这种情况下,是否“选项4”可能会引起争议”减少耦合,因为本质上仍然存在相同的代码。我认为这可能有助于提高可维护性,因为依赖这两个类的代码与这两个类隔离开来,因此它不是它们契约的一部分。