2017-05-08 2 views
21

Ich möchte in der Lage sein, eine Klasseninstanz in eine öffentliche statische Variable zu speichern, aber ich kann nicht herausfinden, wie dies in Kotlin zu tun.Kotlin statische Methoden und Variablen

class Foo { 

    public static Foo instance; 
    public Foo() { 
     instance = this; 
    } 

} 
+6

https://kotlinlang.org/docs/reference/classes.html#companion-objects. Aber das sieht mir schrecklich aus.Warum möchten Sie ein veränderbares statisches Feld verwenden (schon schlechte Praxis) und es jedes Mal ändern, wenn Sie eine Instanz von Foo erstellen? Was versuchst du zu erreichen? –

+3

Wenn Sie einen Singleton erstellen möchten, gehen Sie zu https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations. –

Antwort

32

Den statischen Feldern von Java am nächsten kommt ein Begleitobjekt. Sie können die Dokumentation Referenz für sie hier finden: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

Ihr Code in Kotlin etwas würde wie folgt aussehen:

class Foo { 

    companion object { 
     lateinit var instance: Foo 
    } 

    init { 
     instance = this 
    } 

} 

Wenn Sie Ihre Felder wollen/Methoden als statische Anrufer Java ausgesetzt sein, können Sie gelten die @JvmStatic Anmerkung:

class Foo { 

    companion object { 
     @JvmStatic lateinit var instance: Foo 
    } 

    init { 
     instance = this 
    } 

} 
+2

Die Verwendung von 'Companion Object' zum Deklarieren eines' Instanz'-Feldes ist ein Boilerplate, das vom Kotlin-Compiler automatisch beachtet wird, wenn Sie 'Foo' einfach als' Objekt Foo {...} 'deklarieren –

4

Sie zunächst eine einfache Klasse erstellen Sie dann nach einem Block von Begleitobjekt Stichwort

gefolgt erstellen

zum Beispiel:

class Test{ 

    companion object{ 

     fun getValue(): String{ 

      return "Test String" 

     } 
    } 
} 

Sie diese Klasse Funktion Klasse Funktionsnamen Punktnamen nennen kann

zum Beispiel:

// here you will get the function value 
Test.getValue() 
0

Sie können eine Begleitobjekt für die Klasse erstellen, und wenn Sie können wirklich das Feld statisch sein, Sie können die Annotation @JvmStatic verwenden. Companion-Objekte haben Zugriff auf private Mitglieder der Klasse, für die sie ein Partner ist.

Siehe unten Beispiel:

class User { 
    private lateinit var name: String 

    override fun toString() = name 

    companion object { 
     @JvmStatic 
     val instance by lazy { 
      User().apply { name = "jtonic" } 
     } 
    } 
} 

class CompanionTest { 

    @Test 
    fun `test companion object`() { 
     User.instance.toString() shouldBe "jtonic" 
    } 
} 
9

Es sieht aus, dass Sie ein Singleton-Objekt definieren möchten. Es wird in Kotlin als First-Class-Konzept unterstützt:

object Foo { 
    ... 
} 

die vorformulierten Alle Code mit statischem Feld und Konstruktor wird von der Kotlin automatisch versorgt. Sie müssen nichts davon schreiben.

Aus dem Kotlin-Code können Sie die Instanz dieses Objekts einfach als Foo bezeichnen. Aus dem Java-Code können Sie die Instanz dieses Objekts als Foo.INSTANCE verweisen, da der Kotlin-Compiler automatisch das entsprechende statische Feld mit dem Namen INSTANCE erstellt.

1

Wenn Sie den Stil des Schreibens der Statik am Anfang der Klasse in Java folgen, schlage ich vor, zu versuchen, sie auf der obersten Ebene (z. B. vor der Klassendeklaration) in Kotlin zu schreiben. Für viele Anwendungsfälle, es funktioniert besser als ein Begleiter Einführung

Beispielcode Objekt:

class Person { 
    companion object Test { 
    fun callMe() = println("I'm called.") 
    } 
} 

fun main(args: Array<String>) { 
Person.callMe() 
} 

Wenn Sie das Programm ausführen, wird die Ausgabe:

ich genannt habe.