如何从 kotlin 中的对象实例访问伴随对象?

how to access companion object from object instance in kotlin?

带有伴生对象的简单示例class

class MyClass {
  companion object {
     val test = 25
  }
}

可以通过MyClass.test访问值测试,但是如何从 我的类的实例?如果我有 val sample = MyClass(),我该如何访问示例中的测试? sample::class.test 不正确....有办法吗?

已提出问题:'Why not simply use MyClass.test'?

我更愿意将问题留给 'how' 而不是 'why',但既然有人问我,我会尝试 'why'。这同样适用于方法。为什么不在 class 中使用静态函数并简单地调用 Class.function() 并将对象作为参数之一传递?

考虑在处理作为更抽象的基础传递的对象时 class,您正在处理的对象可能有多个 classes。

您可以进行切换并针对每个可能 class 并以这种方式从适当的 class 访问值(或函数),但多态性的思想是您应该能够像方法一样访问 class 属性(即使是同一 class 的所有成员的函数方法代码)或来自对象实例的 class 所有成员共有的值class.

到目前为止,我的解决方案是简单地将 MyClass 的等价物实现为静态

public class MyClass {
    static Integer test = 25;
    public Integer testGetter(){ return test; }    
}

在 Java、C++、python 等中有对此的简单解决方案....(我将提供每个有用的代码示例)并且我认为会有一个在 kotlin 中比使用 Java.

更好的解决方案

对于 class 属性在没有对象实例(如工厂)的情况下访问的情况,kotlin 伴随对象提供了静态的替代方法(并且具有优势),但是静态的另一种用途是尽管对象实例可能可用,但静态是合适的,因为单个属性可以由 class 的所有成员共享,并且该属性不依赖于实例。

使用反射,你可以通过companionObject:

sample::class.companionObject?.memberProperties?.find { it.name == "test" }

问题在于,虽然可以从 class 外部访问对象属性,但前提是它们不是 public,但伴生对象的属性则不能。这意味着为要在 class.

外部访问的任何伴生对象属性添加 getter(以及相关的 setter)
class MyClass{
  companion object{
     val test = 25
  }
  var staticTest get() = test  // getter for test
}

那么访问所需的只是::

sample.staticTest

或者您可以提供对伴随对象的访问...

class MyClass{
    companion object{
        val test = 25
    }
    var companion = Companion
}

然后允许完全访问随播广告中的任何内容

像这样在kotlin中使用静态变量是另一种方式..

object AppConstant {
  const val baseUrl : String = ""
  const val KEY_PRODUCT_ITEM="productItem"
}

当像这样访问项目的任何地方时..

AppConstant.KEY_PRODUCT_ITEM

否则导入 AppConstant。然后只使用 KEY_PRODUCT_ITEM

对于大多数看这个问题的人来说,最好的解决办法是按照 Oliver 所说的去做:

just use MyClass.test

伴随对象在每个实例中都是相同的,因此作为 class 本身的 属性 而不是特定实例更容易访问。

如果您的 class 是:

class MyClass {
  companion object {
     val test = 25
  }
}

访问测试:

var sample = MyClass()
var t = MyClass.test // will be 25, note that this doesn't depend on #sample

我知道这不是 OP 正在寻找的答案,但他的要求非常具体,可以说任何提出这个问题的人都不希望看到这个问题。