【发布时间】:2018-01-29 02:02:13
【问题描述】:
Kotlin 有这个 data class 非常方便,比如提供自动 toString、equal 等。但是如果我们不使用这些函数,它们会被 proguard 优化掉吗?
我问是因为我想知道我们是否应该谨慎使用data class(例如,对于我们不使用toString、equal 等的情况,我们不应该使用数据类,而是使用普通类, 即使它们是模型类..)
【问题讨论】:
Kotlin 有这个 data class 非常方便,比如提供自动 toString、equal 等。但是如果我们不使用这些函数,它们会被 proguard 优化掉吗?
我问是因为我想知道我们是否应该谨慎使用data class(例如,对于我们不使用toString、equal 等的情况,我们不应该使用数据类,而是使用普通类, 即使它们是模型类..)
【问题讨论】:
我问是因为我想知道我们是否应该谨慎使用数据类
覆盖Object 的方法(例如equals、hashCode、toString)的公共方法在收缩期间始终保持不变;不可能安全地移除它们。这是因为 JVM 和某些系统类(例如HashMap)可能会在您的对象上内部调用这些方法,而 Proguard 无法对 JVM 和系统类的内部进行假设。
覆盖基类方法的其他公共方法以及实现抽象类/接口所需的方法也永远不会优化。理论上应该可以将它们剥离,但 Proguard 目前(从版本 5.* 开始)无法做到这一点。
AFAIK,Kotlin 数据类中的一些自动生成的方法(即component*() 和copy() 方法)不会覆盖任何基本方法,它们只是由编译器根据合同使用。这些方法可以在收缩过程中删除,前提是没有使用它们。如果未使用,也可以删除自动生成的构造函数。
TL;DR:您可以使用 Proguard 安全地处理数据类,唯一需要注意的是 equals、hashCode 和 toString 始终保留,即使未使用也是如此。
【讨论】: