105 votes

Quel est le meilleur moyen de définir la constante de log TAG dans Kotlin?

Je suis de créer mon premier Kotlin des cours dans mon application Android. Généralement pour l'enregistrement j'ai un constant avec le nom TAG. Ce que je voudrais faire en Java:

private static final String TAG = MyClass.class.getSimpleName();

Je sais que dans Kotlin classes que je peux créer TAG à l'aide de cette façon:

private val TAG = MyClass::class.java.simpleName

C'est OK pour les projets qui utilisent Java et Kotlin mais si je commence un nouveau projet qui n'est que dans Kotlin? Comment puis-je définir des TAG - elle constante? Il y a plus d'Kotlin chemin où je n'ai pas cette étrange construction class.java.simpleName?

85voto

Fredy Mederos Points 957

Cette extension nous permet d’utiliser TAG dans n’importe quelle classe

 val Any.TAG: String
    get() {
        val tag = javaClass.simpleName
        return if (tag.length <= 23) tag else tag.substring(0, 23)
    }

//usage
Log.e(TAG,"some value")
 

Il a également validé pour fonctionner comme une balise de journal valide Android.

65voto

Gabriele Mariotti Points 7243

En général, les constantes sont toutes des majuscules (ex. FOO) et sont situées dans l' objet compagnon :

 class MyClass {
    companion object {
        public const val FOO = 1

    }
}
 

et pour définir le champ TAG, vous pouvez utiliser:

 private val TAG = MyClass::class.qualifiedName
 

22voto

Doctoror Drive Points 6721

Souvent suggéré approche de l'aide de l' companion object génère extra - static final exemple d'un compagnon de classe et est donc un mauvais rendement et de la mémoire-sage.

Le meilleur moyen (à mon humble avis)

Définir un journal balise comme un haut-niveau constant, donc uniquement en classe supplémentaire est généré (MyClassKt), mais par rapport à d' companion object il n'y aura pas d' static final instance (et aucune instance que ce soit):

private const val TAG = "MyLogTag"

class MyClass {

    fun logMe() {
        Log.w(TAG, "Message")
    }
}

Une autre option

Utiliser une normale val. Bien que cela semble inhabituel de voir un journal tag pas tous les majuscules constant, ce qui ne génèrent pas de toutes les classes et a le moins de frais généraux.

class MyClass {

    private val tag = "myLogTag"

    fun logMe() {
        Log.w(tag, "Message")
    }
}

15voto

user8159708 Points 1360

Dans Kotlin, vous pouvez créer une extension et appeler tag en tant qu'appel de méthode. Cela signifierait que vous n'auriez jamais à le définir à l'intérieur de chaque classe, nous pouvons le construire dynamiquement chaque fois que nous appelons la méthode:

 inline fun <reified T> T.TAG(): String = T::class.java.simpleName
 

11voto

nickgzzjr Points 151

Faire simplement ce qui suit a fonctionné pour moi.

 private val TAG = this::class.java.simpleName
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X