2016-06-24 3 views
11

ho scritto questo metodi in Kotlin e analizzato il bytecode:Kotlin oggetto vs compagno-oggetto vs pacchetto ambito metodi

Situazione 1

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

Situazione 2

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

Situazione 3

fun doSomething() {} 

Bytecode Risultato

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

Le mie domande sono:

  • Ho una classe enum e voglio restituire una istanza enum data una variabile enum, ad esempio findAmm (enum(id, color)). Come lo farei? Companion Object? oggetto?

  • Sembra che l'unico modo per avere un metodo statico reale sia a livello di pacchetto, senza dichiarazione di classe. Ma diventa un po 'troppo globale. C'è un modo per accedervi tramite: ClassName.staticMethod, staticMethod essendo veramente statico.

  • Fornire esempi significativi di metodi di dichiarazione del pacchetto, oggetto associato e oggetto.

Contesto. Ho fatto il codice di Kotlin e lo trovo fantastico. Ma a volte ho bisogno di prendere una decisione: per esempio, una pesante proprietà immutabile che in java dichiarerei definitiva statica, ma a Kotlin trovo difficile "trovare un equivalente".

+0

Forse questo potrebbe essere di aiuto {http://stackoverflow.com/q/37794850/2804610} – EPadronU

+0

In rega rds al tuo ultimo paragrafo, penso che questa risposta possa aiutarti {http://stackoverflow.com/a/37944990/2804610} – EPadronU

risposta

3

vorrei suggerire di sviluppare voddan answer:

enum class Color { 

    RED, 
    BLUE, 
    GREEN; 


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

e per testare

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

Perché non chiamare direttamente dalla classe 'Color'? 'Println (Color.findById (Color.valueOf ("RED")));' – UnKnown

8

Se si dispone di una funzione che esegue un'azione strettamente correlata a una classe ma non richiede un'istanza di classe, ad esempio l'esempio findById, è necessario inserirla nell'oggetto associato della classe.

Se si desidera esporre un metodo come metodo statico al codice Java, è possibile annotarlo con l'annotazione @JvmStatic.

5

Se una funzione non richiede un'istanza di una classe, allora è la decisione del progettista dove metterla. Usa il livello del pacchetto se è specifico del pacchetto, usa un compagno di classe se si relaziona strettamente alla classe (per esempio le altre classi nel pacchetto hanno funzioni simili).

Nota che enum ha diverse proprietà in-build e modelli:

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)