引用没有完全限定的嵌套对象

时间:2019-03-22 20:36:51

标签: kotlin

我有如下代码(由我控制):

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)
}

...即使我尝试将ObjectAObjectB移到FirstVeryLongName的同伴中并编写文字,我也无法完成工作

FirstVeryLongName.Companion.run { ... }

...我希望对对象提供无限制的访问,就像伴随对象中的val一样。

我特别想避免的一件事是类型别名或将其导入为别名。我希望它很明显没有交叉引用,或者手动查看所有这些都是来自哪里的导入。

是否有一些技巧可以让我编写这段代码,并分别写一次FirstVeryLongNameObjectAObjectB

1 个答案:

答案 0 :(得分:0)

对我来说,它没有按照您尝试的方式工作。

类名本身不是实例,因此runwith不适用。就像写程序包名称一样,仅此而已。这也不起作用。

关于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中使用仅类名或导入语句的一部分,因此也无法以这种方式简化对单例实例的访问。

但是,您可以执行以下操作。注意:我显然不建议采用这种方法(我不认为您确实需要同时使用withobject)。也许您也可以在此处使用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()的签名可以不同。