在Kotlin中限定Java静态方法的作用域



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

现在我需要在kotlin代码中使用它们构造复杂的调用,就像这样:

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

现在,我想使用一个局部作用域函数,以便不经常重复自己。但是,简单地使用

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

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

唯一的"解决方案"是全局导入aVeryLongNameThatIDontWantToTypeEveryTime.*在文件中,这不是很好,因为方法名称是如此通用,可能会发生冲突。

您可以使用import别名在本地为其提供一个更方便的名称:

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中也有类似的任务。

最新更新