2016-07-07 38 views
12

Come fare una proprietà in Kotlin che ha un getter privato (o semplicemente non ce l'ha) ma ha un setter pubblico?Private getter e public setter per una proprietà Kotlin

var status 
private get 

non funziona con un errore: Getter visibility must be the same as property visibility

Nel mio caso, il motivo è per Java interoperabilità: voglio che il mio codice Java per essere in grado di chiamare setStatus ma non getStatus.

+0

Solo curioso: perché vorresti farlo? Un campo di sola scrittura? – Fildor

+0

ottenere privati ​​significa utilizzare la proprietà direttamente nella classe, non è vero? –

+0

Sì. Un campo di sola scrittura. Viene letto solo all'interno della classe. – yuku

risposta

9

è impossibile nel momento in Kotlin ad avere una proprietà con un setter che è più visibile rispetto alla proprietà. C'è un problema di design della lingua nel tracker dei problemi su questo, sentiti libero di guardarlo/votarlo o condividere i tuoi casi d'uso: https://youtrack.jetbrains.com/issue/KT-3110

11

nella versione corrente Kotlin (1.0.3) l'unica opzione è quella di avere separato setter metodo in questo modo:

class Test { 
    private var name: String = "name" 

    fun setName(name: String) { 
     this.name = name 
    } 
} 

Se si desidera limitare le librerie esterne di accedere al getter è possibile utilizzare internal visibilità modificatore che consente di utilizzare ancora sintassi di proprietà all'interno della libreria:

class Test { 
    internal var name: String = "name" 
    fun setName(name: String) { this.name = name } 
} 

fun usage(){ 
    val t = Test() 
    t.name = "New" 
} 
+1

Proprio come un componente aggiuntivo se si prevede di utilizzare il codice Java, la parola chiave interna alla fine diventerà pubblica nel mondo Java –

Problemi correlati