如何在 kotlin 中“静态”访问类的成员?

Posted

技术标签:

【中文标题】如何在 kotlin 中“静态”访问类的成员?【英文标题】:How to access a member of a class "statically" in 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 应该就够了 ***.com/questions/40352684/… 的副本? @Xvolks 问题是关于访问 Java 代码中恰好是私有的静态字段。这不是重复的。 @the_new_mr 你不应该在静态字段中放置上下文。这是内存泄漏 @LunarWatcher OP 想要静态调用getAppContext(),就像我在线程中指出的那样。我错过了什么吗? 【参考方案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 代码:

    Visit Link 找到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

【讨论】:

以上是关于如何在 kotlin 中“静态”访问类的成员?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Kotlin 的内部类访问外部类的成员?

在 Kotlin 中如何从不同的模块访问内部成员

kotlin伴生对象(java静态成员)

C++ - 如何从同一个类的静态函数访问一个类的私有成员?

静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

[Kotlin] 内部类