2016-06-24 13 views
11

I dieses Verfahren in Kotlin geschrieben und analysiert, um den Bytecode:Kotlin Objekt vs Begleiter-Objekt vs Paket scoped Methoden

Situation 1

class A { 
    object b { 
     fun doSomething() {} 
    } 
} 

Situation 2

class A { 
    companion object b { 
     fun doSomething() {} 
    } 
} 

Situation 3

fun doSomething() {} 

Bytecode Ergebnis

  • Situation 1: Klasse Test$asb, public final doSomething()I
  • Situation 2: Klasse Test$Companion, public final doSomething()I
  • Situation 3: Klasse TestKt, public final static doSomething()I

Meine Fragen sind:

  • Ich habe eine enum-Klasse, und ich möchte eine enum-Instanz mit einer enum-Variablen zurückgeben, zum Beispiel findById (enum(id, color)). Wie würde ich es tun? Begleitobjekt? Objekt?

  • Es scheint die einzige Möglichkeit, eine echte statische Methode haben, ist in Paketebene, ohne Klassendeklaration. Aber das wird ein bisschen zu global. Gibt es eine Möglichkeit, über: ClassName.staticMethod darauf zuzugreifen, staticMethod ist wirklich statisch.

  • Bereitstellung meaningfull Beispiele für Paket Erklärung Methoden, Begleitobjekt und Objekt.

Kontext. Ich habe in Kotlin programmiert und finde es erstaunlich. Aber manchmal muss ich eine Entscheidung treffen: zum Beispiel eine schwere unveränderliche Eigenschaft, die ich in Java als statisches Finale deklarieren würde, aber in Kotlin fällt es mir schwer, "ein Äquivalent zu finden".

+0

Vielleicht könnte dies der Hilfe {http://stackoverflow.com/q/37794850/2804610} – EPadronU

+0

In rega rds zu Ihrem letzten Absatz, ich glaube, diese Antwort könnte Ihnen helfen {http://stackoverflow.com/a/37944990/2804610} – EPadronU

Antwort

3

Ich würde vorschlagen, voddan answer zu entwickeln:

enum class Color { 

    RED, 
    BLUE, 
    GREEN; 


    companion object Utils { 
     fun findById(color: Color): Color { 
      return color; 
     } 
    } 
} 

Und testen

@Test 
fun testColor() { 
    println(Color.Utils.findById(Color.valueOf("RED"))); 
} 
+3

Warum nicht direkter Aufruf von 'Color' Klasse? 'println (Color.findById (Color.valueOf (" RED ")));' – UnKnown

8

Wenn Sie eine Funktion haben, die eine Aktion ausführt, die eng verwandt mit einer Klasse ist, aber keine Klasseninstanz benötigt, wie z. B. Ihr findById Beispiel, sollten Sie sie in das Begleitobjekt der Klasse einfügen. Wenn Sie eine Methode als statische Methode für Java-Code verfügbar machen möchten, können Sie sie mit der Anmerkung @JvmStatic annotieren.

5

Wenn eine Funktion keine Instanz einer Klasse benötigt, dann ist es Ihre Design-Entscheidung, wo es zu setzen. Verwenden Sie die Paket-Ebene, wenn sie paket-spezifisch ist, verwenden Sie eine Klassen-Komponente, wenn sie eng an die Klasse verweist (z. B. haben andere Klassen im Paket ähnliche Funktionen).

Beachten Sie, dass enum hat mehrere in-build Eigenschaften und Muster:

enum class Colour(val value: Int) { 
    black(100), red(200), green(300) 
} 

fun colourById(id: Int) = Colour.values[id] 
fun colourByValue(value: Int) = Colour.values.first {it.value == value} 
fun colourByName(name: String) = Colour.valueOf(name)