【问题标题】:Scoping Java static methods in Kotlin在 Kotlin 中确定 Java 静态方法的范围
【发布时间】:2021-10-22 19:22:41
【问题描述】:

有一个Java 库的类有aVeryLongNameThatIDontWantToTypeEveryTime。这个类有一些具有通用名称的静态方法:get()abs() 等。

现在我需要在我的 kotlin 代码中使用它们构建复杂的调用,如下所示:

aVeryLongNameThatIDontWantToTypeEveryTime.get(aVeryLongNameThatIDontWantToTypeEveryTime.abs(aVeryLongNameThatIDontWantToTypeEveryTime.get(...), aVeryLongNameThatIDontWantToTypeEveryTime.get(...)))

现在,我想使用本地范围功能,以免经常重复自己。但是,只需使用

with(aVeryLongNameThatIDontWantToTypeEveryTime) {
  get(abs(get(...), get(...)))
}

不起作用:它抱怨 aVeryLongNameThatIDontWantToTypeEveryTime 没有伴随对象。 (当然不是,它是一个 Java 类。)

唯一的“解决方案”是在文件中全局导入aVeryLongNameThatIDontWantToTypeEveryTime.*,这不是很好,因为方法名称非常通用并且可能发生冲突。

【问题讨论】:

  • 考虑使用Type aliases?
  • 确实是减少长度的好方法,但您仍然需要在任何地方都有someAlias.。这是针对症状(长名称)而不是实际问题(重复)。

标签: kotlin scoping kotlin-java-interop


【解决方案1】:

你可以使用import alias在本地给它起一个更方便的名字:

import com.example.aVeryLongNameThatIDontWantToTypeEveryTime as MyShortName

如果您更喜欢您的范围解决方案,那么我认为现在唯一的方法是指定您自己的“范围”:

object aVeryLongNameThatIDontWantToTypeEveryTimeScope {
    inline fun get() = aVeryLongNameThatIDontWantToTypeEveryTime.get()
    inline fun set() = aVeryLongNameThatIDontWantToTypeEveryTime.set()
    inline fun abs() = aVeryLongNameThatIDontWantToTypeEveryTime.abs()
}

with (aVeryLongNameThatIDontWantToTypeEveryTimeScope) {
    get()
    set()
    abs()
}

不幸的是,这需要重写所有函数,包括它们的参数。

将来可以像使用伴生对象一样使用 Java 静态成员。 Kotlin 的 YouTrack 中也有类似的任务。

【讨论】:

  • 如上所述,我要解决的问题是重复,而不是我需要键入/让 IDE 自动完成的数量。不过,别名仍然可以消除很多视觉噪音。
  • 我更新了答案。
  • 有趣的解决方案,但不幸的是在实践中并不是那么简单:该库有 的方法和重载的变体。即使只是列出我真正需要的那些也会导致大量的样板文件,尤其是 w.r.t.参数。仅访问可用方法的子集对于自动完成等也不是很好的开发体验。是否有更通用的方法将具有静态方法的 Java 对象转换为 with() 可以处理的东西?
  • 我不相信,但也许我错过了什么。我绝对不喜欢 Kotlin 的某些功能如何依赖于同伴的存在。例如,如果一个类没有同伴,我们就不能向它添加“静态”扩展。我相信有一天 Kotlin 团队必须统一同伴和 Java 静态成员。他们的跟踪器中有很多类似的问题,例如:youtrack.jetbrains.com/issue/KT-11968 和所有相关的。甚至有建议:“这可以通过向每个类添加默认伴随对象来实现” - 这将使您的上述代码成为可能。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 2020-06-21
  • 1970-01-01
  • 2014-03-23
  • 2017-09-10
  • 2017-02-09
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多