Kotlin中的静态内部类

55

如果存在的话,Kotlin语言中替代内部静态类的选项是什么?如果没有,当我需要在Kotlin中使用静态类时,我该如何解决这个问题?请参见以下代码示例:

 inner class GeoTask : AsyncTask<Util, Util, Unit>() {

    override fun doInBackground(vararg p0: Util?) {

        LocationUtil(this@DisplayMembers).startLocationUpdates()
    }
}

我已经搜索了很多,但没有找到任何有效的信息,非常感谢您的帮助。


你需要一个替代方案来解决什么问题?哪些方案无法正常工作? - Salem
在我的问题代码中,出现了内存泄漏的问题,因为我使用了包含活动上下文的asynTask。Android Studio建议我使用内部静态类。 - Osama Mohammed
3个回答

135

在 Kotlin 中,只需省略 inner 关键字即可。

内部类(持有外部对象引用)

Java:

class A {
    class B {
    ...
    }
}

Kotlin:

Kotlin:
class A {
    inner class B {
    ...
    }
}

静态内部类,也称为嵌套类(无对外部对象的引用)

Java:

class A {
    static class B {
    ...
    }
}

Kotlin:

class A {
    class B {
    ...
    }
}

5

您还可以将“class”更改为“object”

class OuterA {
  object InnerB {
  ... }
}

或者

object OuterA {
  object InnerB {
  ... }
}

1
在这种情况下有什么区别? - yanefedor
这可能会有所帮助: https://kotlinlang.org/docs/object-declarations.html#object-declarations-overview - GFPF

0
在Android世界中,良好的实践包括:
- 避免在活动中使用非静态内部类; - 使用带有WeakReference的静态内部类,以便在不使用时可以进行垃圾回收(Garbage Collected),如下面的示例所示:
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        MySingleton.init(this)
    }
}

object MySingleton {

    var weakContext: WeakReference<Context>? = null

    fun init(ctx: Context) {
        this.weakContext = WeakReference(ctx)
    }
}

当MainActivity实例被销毁(调用onDestroy时),它的上下文弱引用也会被销毁,因此不会发生内存泄漏。:]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接