如何在 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 中“静态”访问类的成员?的主要内容,如果未能解决你的问题,请参考以下文章