Comportamento de métodos estáticos no Kotlin
1. Visão geral
Uma maneira pela qualthe Kotlin language difere de Java é que Kotlin não contémthe static keyword com o qual estamos familiarizados.
Neste tutorial rápido, veremos algumas maneiras de obter o comportamento do método estático Java em Kotlin.
2. Funções em nível de pacote
Vamos começar criando um arquivoLoggingUtils.kt. Aqui, criaremos um método muito simples chamadodebug. Como não nos importamos muito com a funcionalidade dentro de nosso método, imprimiremos apenas uma mensagem simples.
Como estamos definindo nosso método fora de uma classe, ele representa uma função no nível do pacote:
fun debug(debugMessage : String) {
println("[DEBUG] $debugMessage")
}
Também veremos no código descompilado que nosso métododebug agora é declarado comostatic:
public final class LoggingUtilsKt {
public static final void debug(@NotNull String debugMessage) {
Intrinsics.checkParameterIsNotNull(debugMessage, "debugMessage");
String var1 = "[DEBUG] " + debugMessage;
System.out.println(var1);
}
}
3. ObjetosCompanion
Kotlin nos permite criar objetos comuns a todas as instâncias de uma classe - os objetos complementares. Podemos criar uma instância singleton de um objeto apenas adicionando a palavra-chavecompanion.
Vamos definir nosso método de depuração dentro de um objetocompanion:
class ConsoleUtils {
companion object {
fun debug(debugMessage : String) {
println("[DEBUG] $debugMessage")
}
}
}
Nosso código descompilado nos mostra que podemos acessar o métododebug por meio do objetoCompanion:
public final class ConsoleUtils {
public static final ConsoleUtils.Companion Companion
= new ConsoleUtils.Companion((DefaultConstructorMarker) null);
public static final class Companion {
public final void debug(@NotNull String debugMessage) {
Intrinsics.checkParameterIsNotNull(debugMessage, "debugMessage");
String var2 = "[DEBUG] " + debugMessage;
System.out.println(var2);
}
private Companion() {}
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
Para evitar chamar a instância resultante pelo nome genéricoCompanion, , swe também pode fornecer um nome personalizado.
Finalmente, para fazer o métododebugstatic novamente, devemos usar a anotação@JvmStatic:
class ConsoleUtils {
companion object {
@JvmStatic
fun debug(debugMessage : String) {
println("[DEBUG] $debugMessage")
}
}
}
Ao usá-lo, acabaremos com um métodostatic final void debug real em nosso código descompilado:
public final class ConsoleUtils {
public static final ConsoleUtils.Companion Companion
= new ConsoleUtils.Companion((DefaultConstructorMarker) null);
@JvmStatic
public static final void debug(@NotNull String debugMessage) {
Companion.debug(debugMessage);
}
public static final class Companion {
@JvmStatic
public final void debug(@NotNull String debugMessage) {
Intrinsics.checkParameterIsNotNull(debugMessage, "debugMessage");
String var2 = "[DEBUG] " + debugMessage;
System.out.println(var2);
}
private Companion() {}
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
Agora, poderemos acessar este novo método diretamente por meio da classeConsoleUtils.
4. Conclusão
Neste breve tutorial, vimos como replicar em Kotlin o comportamento dos métodos Javastatic. Usamos funções de nível de pacote e também objetos complementares.
A implementação de todos esses snippets pode ser encontradaover on GitHub.