【问题标题】:How to access a member of a class "statically" in kotlin?如何在 kotlin 中“静态”访问类的成员?
【发布时间】:2018-02-09 19:31:17
【问题描述】:

在 Java 和 Android 中,我们可以这样做:

public static MyApplication extends Application {
   private static Context appContext;

   public void onCreate() {
      appContext = this;
   }

   public static Context getAppContext() {
      return appContext;
   }
}

这样,我们可以在其他地方这样做:

appContext = MyApplication.getAppContext();

我们如何在 Kotlin 中做到这一点?过去一个小时左右,我一直在兜圈子。

提前致谢。

//编辑 也许我应该更清楚。我的意思是我们如何在 Kotlin 中编写上述内容并在 Kotlin 中使用它。

【问题讨论】:

  • 只需调用appContext。我认为 Kotlin 与外部类一起工作以进行像 kotlin 这样的调用(但在可能的情况下,在 Java 字节码中使用 getter 代替)。调用 MyApplication.appContext 应该就够了
  • @Xvolks 问题是关于访问 Java 代码中恰好是私有的静态字段。这不是重复的。
  • @the_new_mr 你不应该在静态字段中放置上下文。这是内存泄漏
  • @LunarWatcher OP 想要静态调用getAppContext(),就像我在线程中指出的那样。我错过了什么吗?

标签: android kotlin


【解决方案1】:

在 Kotlin 中,这称为“伴侣对象”:

class MyApplication: Application {
    companion object {
        var appContext: Context? = null
            private set
    }
}

【讨论】:

    【解决方案2】:

    我缺少的关键元素是使用 init 块来设置伴随对象内的 appContext(我已经尝试过伴随对象路径,但很难真正设置 appContext)。

    见下面的代码:

    class MyApplication : Application() {
    
        init {
            appContext = this
        }
    
        companion object {
            lateinit var appContext: Context
                private set
        }
    }
    

    这可以像往常一样通过以下方式调用:

    val testContext = MyApplication.appContext
    

    【讨论】:

    • 如果要使类型不可为空,可以将var appContext: Context? = null替换为lateinit var appContext: Context
    • 不错的一个!谢谢 :) 不知道为什么我以前没有尝试过。
    【解决方案3】:

    假设您在 android 中有一些 java 代码,并且您想将其转换为 kotlin 代码:

    1. Visit Link
    2. 找到Convert from java

    它可以帮助我将我在互联网上找到的java 代码转换为kotlin 代码,

    这个answer 可能无法帮助您解决您的问题,但它会帮助您将您在java 中知道的内容转换为您在kotlin 中不知道如何操作的内容

    【讨论】:

      【解决方案4】:

      你可以这样使用它

      companion object{  
       //your static fields 
      }
      

      从 kotlin ==> ClassName.FieldName 调用它

      从 java ==> ClassName.Companion.getFieldName() 调用它

      【讨论】:

      • 您没有回答问题:如何从 kotlin 调用静态字段/getter?它不在伴生对象中,它源自 Java 代码
      • 我调用了 appContext = MyApplication.getAppContext(); 来自 Kotlin 的静态 java getter,它起作用了
      【解决方案5】:

      看起来你在运行时只想要这个类的一个对象。这称为单例。有一些建议可以在 Java 中正确实现。幸运的是 Kotlin 直接允许您在顶级范围内声明单例对象:

      val o = object { your attributes and methods here}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-18
        • 2022-01-17
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多