我有如下代码(由我控制):
class FirstVeryLongName {
object ObjectA
object ObjectB
object ObjectC
}
class SecondVeryLongName {
object ObjectB
object ObjectD
}
我需要编写的代码等效于
operation1(FirstVeryLongName.ObjectA, FirstVeryLongName.ObjectB)
operation2(SecondVeryLongName.ObjectB, SecondVeryLongName.ObjectD)
...除了重复使用非常长的名称会增加很多混乱。
这是我希望可以使用的功能,但似乎不起作用:
FirstVeryLongName.run {
operation1(ObjectA, ObjectB)
}
...即使我尝试将ObjectA
和ObjectB
移到FirstVeryLongName
的同伴中并编写文字,我也无法完成工作
FirstVeryLongName.Companion.run { ... }
...我希望对对象提供无限制的访问,就像伴随对象中的val
一样。
我特别想避免的一件事是类型别名或将其导入为别名。我希望它很明显没有交叉引用,或者手动查看所有这些都是来自哪里的导入。
是否有一些技巧可以让我编写这段代码,并分别写一次FirstVeryLongName
,ObjectA
和ObjectB
?
答案 0 :(得分:0)
对我来说,它没有按照您尝试的方式工作。
类名本身不是实例,因此run
或with
不适用。就像写程序包名称一样,仅此而已。这也不起作用。
关于Companion
方法,我假设您实现了以下方法:
class FirstVeryLongName {
companion object {
object ObjectA
object ObjectB
object ObjectC
}
}
和用法,例如:
with(FirstVeryLongName.Companion) {
operation1(ObjectA, ObjectB)
}
实际上,只要您为随播广告定义了此类属性,此方法就可以工作(这也适用于函数)。实际上,这也是您提到自己的事情。您可能想要查看生成的字节码,以查看object
实际对应的内容(如果尚未执行的话)。如果您这样做了,则可以跳过本段的其余部分;-)可以将其视为只是嵌套类。因此,在上面的示例中,我们在Companion
类内部有3个嵌套类。
在Kotlin中,您对单例FirstVeryLongName
字段的访问权限已隐藏。在Kotlin代码中,INSTANCE
可以表示类型和单例实例引用。上下文是相关的。
由于您不能在FirstVeryLongName.Companion.ObjectA
/ run
中使用仅类名或导入语句的一部分,因此也无法以这种方式简化对单例实例的访问。
但是,您可以执行以下操作。注意:我显然不建议采用这种方法(我不认为您确实需要同时使用with
和object
)。也许您也可以在此处使用object expression?很有可能是一种更简单的方法来构造代码,但是如果没有适当的上下文,我只能猜测...我可能是错的):
val
现在class FirstVeryLongName {
companion object {
val ObjectA = FirstVeryLongName.ObjectA // can you use an object expression here?
val ObjectB = FirstVeryLongName.ObjectA
val ObjectC = FirstVeryLongName.ObjectA
}
object ObjectA
object ObjectB
object ObjectC
}
/ run
可以按您期望的方式工作,但是现在它实际上访问了指向with
的{{1}}引用:
val
仅显示一个使用对象表达式的简单示例。您可能想拥有一个公共的超类,接口,或者,如果您不介意,甚至可以在此处使用object
:
with(FirstVeryLongName.Companion) {
operation1(ObjectA, ObjectB)
}
用法仍然看起来相同。现在,只有object : Any()
的签名可以不同。