Como você define um método de extensão estática no Kotlin? Isso é possível? Atualmente, tenho um método de extensão, como mostrado abaixo.
public fun Uber.doMagic(context: Context) {
// ...
}
A extensão acima pode ser chamada em uma instância.
uberInstance.doMagic(context) // Instance method
mas como faço para torná-lo método estático, como mostrado abaixo.
Uber.doMagic(context) // Static or class method
static-methods
kotlin
Ragunath Jawahar
fonte
fonte
Respostas:
Para conseguir
Uber.doMagic(context)
, você pode gravar uma extensão no objeto complementar deUber
(a declaração do objeto complementar é necessária):fonte
É o que a documentação oficial diz:
Métodos estáticos de Kotlin
fonte
Na verdade, eu tinha essa pergunta exata há 30 minutos, então comecei a procurar e não consegui encontrar nenhuma solução ou solução alternativa para isso, mas durante a pesquisa encontrei esta seção no site da Kotlinglang que afirma que:
Então, eu tive a idéia mais louca de todos os tempos: por que não definir uma função de extensão com um receptor nulo (sem realmente usá-lo) e depois chamá-lo em um objeto nulo! Então eu tentei isso, e funcionou muito bem, mas parecia tão feio. Foi assim:
Então, eu contornei isso criando um val no meu arquivo de extensões do tipo receptor que tinha um valor nulo e depois o usei na minha outra classe. Então, como exemplo, aqui está como eu implementei uma função de extensão "estática" para a
Navigation
classe no Android: No meu arquivo NavigationExtensions.kt:No código que o usa:
Obviamente, este não é um nome de classe, é apenas uma variável do tipo de classe que possui um valor nulo. Isso é obviamente feio no lado do criador de extensões (porque eles precisam criar a variável) e no lado do desenvolvedor (porque eles precisam usar o
SType
formato em vez do nome real da classe), mas é o mais próximo que pode ser alcançado agora comparado às funções estáticas reais. Felizmente, os criadores do idioma Kotlin responderão ao problema que foi criado e adicionarão esse recurso ao idioma.fonte
Você pode criar um método estático usando o objeto Companion, como:
e então você pode chamar assim:
fonte
platformStatic
anotação.platformStatic
foi renomeadoJvmStatic
no Kotlin atual.Recomendamos que você veja este link. Como você pode ver lá, você deve declarar o método no nível superior do pacote (arquivo):
Isso é igual a
Com os constantes, tudo é igual. Esta declaração
é igual a
fonte
Também gosto bastante de ter a possibilidade de adicionar métodos de extensão estática no Kotlin. Como solução alternativa, por enquanto, estou adicionando o método exntension a várias classes em vez de usar um método de extensão estática em todas elas.
fonte
Activity.isDeviceOnline(...)
sem ter uma instância deActivity
.Para criar um método de extensão no kotlin, você deve criar um arquivo kotlin (não uma classe) e, em seguida, declarar seu método no arquivo Por exemplo:
Importe a função na classe ou arquivo em que você está trabalhando e use-a.
fonte