从 Kotlin 代码中移除 getter 和 setter。

6

对于这段代码

class Foo {
    var name: String? = null
}

Kotlin编译器生成:

private String name;
public final String getName() { ... }
public final void setName(String name) { ... }

即使属性name没有自定义的getter或setter方法。使用@JvmField注解可以删除冗余的get和set方法。因此,以下代码可以这样改写:
class Foo {
    @JvmField
    var name: String? = null
}

只生成一个字段而没有其他方法。

public String name;

但是有没有办法让Kotlin编译器在整个项目中为所有属性生成getter和setter?无论是否有注释。也许有一些实验性的编译器标志吗?

我需要这样做是因为我在Kotlin上编写了Android仪表测试。测试apk超过了65k方法计数限制。大约有2k个方法是生成的getter/setter。由于安卓构建系统中存在一些错误,我不能使用proguard或multidex。因此,删除Kotlin合成方法将对我有很大帮助。


这个页面:https://developer.android.com/studio/build/multidex.html#testing 和 Google问题跟踪器中的一些评论表明,“目前不支持使用multidex创建测试APK。” - nnesterov
3
删除合成的getter和setter只是我在优化apk中的方法数方面的一步。但如果有编译器选项或类似的东西,那就太好了。我可以轻松删除2000个方法。 - nnesterov
也许我的问题没有表述清楚。并不是我的应用apk超出了限制。它可以很容易地通过multidex解决。而包含所有测试代码和测试库的apk超出了限制。由于Android构建系统的错误,这个apk无法进行混淆或分包处理。 - nnesterov
已删除注释,因为我知道你想要实现什么!你不能在构建配置中使用 minifyEnabled trueuseProguard false 吗? - Mark
1
没有这样的编译器选项。d8(dex工具的替代品)也许能够删除访问器,但我不确定该功能是否已经实现。 - yole
非常感谢您的回答。我会尝试使用d8。 - nnesterov
1个回答

3
您可以将属性声明为private,这样它们就不会自动生成getter和setter。
class Foo {
  private val foo: String = "foo"
}

这将生成以下类:
→ javap -classpath build/classes/kotlin/test -p test.Foo
Compiled from "Foo.kt"
public final class test.Foo {
  private final java.lang.String foo;
  public test.Foo();
}

1
这不是一个解决方案。 - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接