2016-06-15 28 views
10

ho questo codice di esempio:Kotlin annotazione IntDef

class MeasureTextView: TextView { 
    constructor(context: Context?) : super(context) 
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) 
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) 
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) 

    companion object{ 
     val UNIT_NONE = -1 
     val UNIT_KG = 1 
     val UNIT_LB = 0    
    } 

    fun setMeasureText(number: Float, unitType: Int){ 

     val suffix = when(unitType){ 
      UNIT_NONE -> { 
       EMPTY_STRING 
      } 
      UNIT_KG -> { 
       KG_SUFIX 
      } 
      UNIT_LB -> { 
       LB_SUFIX 
      } 
      else -> throw IllegalArgumentException("Wrong unitType passed to formatter: MeasureTextView.setMeasureText") 
     } 

     // set the final text 
     text = "$number $suffix" 
    } 
} 

voglio essere in grado di utilizzare, al momento della compilazione, la funzione di completamento automatico in combinazione con IntDef annotazioni, così quando invoco setMeasureText(...), statica le variabili sono mostrate come opzioni all'argomento di questo metodo.

Ho cercato su questo, e non ho potuto trovare se Kotlin supportato questa annotazioni in stile java (intdef per esempio). Così l'ho provato, e ho fatto un'annotazione per questo, ma non verrà mostrato nel completamento automatico.

La mia domanda: - è l'annotazione Java IntDef supportato in Kotlin (ultima versione)

  • Se lo è, come posso girare in ON nel Android Studio IDE (se funziona, posso' t ottenere il compilatore di suggerirlo).

  • Se non lo è, c'è qualche Kotlin vie del make questo compilazione controlli orari

+2

[Perché non usare 'enum'] (http://stackoverflow.com/questions/5143256/why-was-avoid-enums-where-you -solo-need-int-rimosso-dal-androidi performanc)? – miensol

+0

nessuna ragione solo patetica. Enums sono stati scoraggiati un paio di anni fa da Google per motivi di prestazioni. Sono abituato a preferire le costanti statiche con annotazioni intdef. Ma quando sono passato a Kotlin la funzionalità è scomparsa –

+1

Possibile duplicato di [Come utilizzare le annotazioni typedef di Android Support in kotlin?] (Http://stackoverflow.com/questions/35976002/how-to-use-android-support-typedef -annotations-in-kotlin) –

risposta

17

A partire dal Kotlin 1.0.3, l'annotazione @IntDef non è supportato, ma il supporto è previsto per le versioni successive .

Il modo Kotlin di eseguire questi controlli di compilazione è utilizzare un enum class anziché una serie di costanti Int.

2

Se si chiama setMeasureText da Java è possibile farlo funzionare creando l'IntDef in Java troppo

// UnitType.java 
@Retention(RetentionPolicy.SOURCE) 
@IntDef({MeasureText.UNIT_KG, MeasureText.UNIT_LB, MeasureText.UNIT_NONE}) 
public @interface UnitType {} 

h/t Tonic Artos

Sarà inoltre necessario aggiornare l'oggetto associato a rendere I vostri valori anela e accessibili al pubblico

companion object{ 
    const val UNIT_NONE = -1L 
    const val UNIT_KG = 1L 
    const val UNIT_LB = 0L 
} 
+0

nah: pi am not. aha. ma grazie per la punta comunque. potrebbe aiutare un altro ppl –

13

cosa strana, ma a questa domanda viene alla ricerca prima che la stessa cosa con right answer

Copia qui:

import android.support.annotation.IntDef 

public class Test { 

    companion object { 

     @IntDef(SLOW, NORMAL, FAST) 
     @Retention(AnnotationRetention.SOURCE) 
     annotation class Speed 

     const val SLOW = 0L 
     const val NORMAL = 1L 
     const val FAST = 2L 
    } 

    @Speed 
    private lateinit var speed: Long 

    public fun setSpeed(@Speed speed: Long) { 
     this.speed = speed 
    } 
} 
+8

questo non risolve nulla. Puoi creare annotazioni allo stesso modo di Java, ma non puoi trarre vantaggio dall'uso di IntDef su Kotlin perché il compilatore non sa come interpretarlo. Il vantaggio di IntDef è che verrà mostrato nel completamento automatico e pertanto, è possibile, la maggior parte delle volte, utilizzare i contatti IntDef anziché enum. Porta via la parte del compilatore e l'annotazione stessa è inutile. –

+1

@ user3806331 non sono d'accordo. Il completamento automatico non è l'unico punto.È utile, perché il parametro annotato è spuntato in fase di compilazione, quindi non puoi chiamare questa funzione con '-1L' per errore –

+6

Non penso che sia vero. Ho provato a utilizzare @StringDef come parte dei parametri del costruttore della mia classe Kotlin e un avviso/errore di compilazione non è mai stato lanciato quando ho passato un tipo non valido. – w3bshark