【问题标题】:Does Data class toString, equal etc get optimized by proguard?数据类 toString、equal 等是否被 proguard 优化?
【发布时间】:2018-01-29 02:02:13
【问题描述】:

Kotlin 有这个 data class 非常方便,比如提供自动 toStringequal 等。但是如果我们不使用这些函数,它们会被 proguard 优化掉吗?

我问是因为我想知道我们是否应该谨慎使用data class(例如,对于我们不使用toStringequal 等的情况,我们不应该使用数据类,而是使用普通类, 即使它们是模型类..)

【问题讨论】:

    标签: kotlin proguard


    【解决方案1】:

    我问是因为我想知道我们是否应该谨慎使用数据类

    覆盖Object 的方法(例如equalshashCodetoString)的公共方法在收缩期间始终保持不变;不可能安全地移除它们。这是因为 JVM 和某些系统类(例如HashMap)可能会在您的对象上内部调用这些方法,而 Proguard 无法对 JVM 和系统类的内部进行假设。

    覆盖基类方法的其他公共方法以及实现抽象类/接口所需的方法也永远不会优化。理论上应该可以将它们剥离,但 Proguard 目前(从版本 5.* 开始)无法做到这一点。

    AFAIK,Kotlin 数据类中的一些自动生成的方法(即component*()copy() 方法)不会覆盖任何基本方法,它们只是由编译器根据合同使用。这些方法可以在收缩过程中删除,前提是没有使用它们。如果未使用,也可以删除自动生成的构造函数。


    TL;DR:您可以使用 Proguard 安全地处理数据类,唯一需要注意的是 equalshashCodetoString 始终保留,即使未使用也是如此。

    【讨论】:

    • 谢谢。听起来可以声明为数据类,因为 proguard 可以相应地处理它们,对吧?
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 2014-06-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多