Qual é o equivalente aos campos finais estáticos de Java no Kotlin?

132

Em Java, para declarar uma constante, você faz algo como:

class Hello {
    public static final int MAX_LEN = 20;
}

Qual é o equivalente em Kotlin?

pdeva
fonte
1
Como val em Kotlin conota somente leitura, não seria suficiente?
IgorGanapolsky

Respostas:

213

De acordo com a documentação da Kotlin , isso é equivalente:

class Hello {
    companion object {
        const val MAX_LEN = 20
    }
}

Uso:

fun main(srgs: Array<String>) {
    println(Hello.MAX_LEN)
}

Também é uma propriedade final estática (campo com getter):

class Hello {
    companion object {
        @JvmStatic val MAX_LEN = 20
    }
}

E, finalmente, este é o campo final estático:

class Hello {
    companion object {
        @JvmField val MAX_LEN = 20
    }
}
Ruslan
fonte
O primeiro exemplo (com campo const) pode ser usado para atributos. Caso popular: declare todos os caminhos da API no arquivo único e faça referência a controladores com esse código: "@RequestMapping (path = arrayOf (WebPathConstants.MapApiPath))" (atributo Spring Boot)
Manushin Igor
Oi pessoal! Você sabe se esse @JvmField ainda é necessário? Estou usando isso no android e ele mostra um aviso de cotão dizendo que "const" pode ser usado. Alterei para const e a classe java que o está usando não apresenta problemas.
Leandro Ocampo
1
@LeandroOcampo ainda é necessário se você tiver um campo estático mutável, const val- compile o tempo constante e, com certeza, ele poderá ser usado como substituto @JvmField valem alguns casos. Através dele, não funciona se o valor - calculado em tempo de execução, ou não é do tipo primitivo ou String. Ref: kotlinlang.org/docs/reference/...
Ruslan
36

se você tem uma implementação Hello, use companion objectdentro de uma classe

class Hello {
  companion object {
    val MAX_LEN = 1 + 1
  }

}

if Helloé um objeto singleton puro

object Hello {
  val MAX_LEN = 1 + 1
}

se as propriedades forem constantes em tempo de compilação, adicione uma constpalavra - chave

object Hello {
  const val MAX_LEN = 20
}

se você quiser usá-lo em Java, adicione @JvmStaticanotação

object Hello {
  @JvmStatic val MAX_LEN = 20
}
Gary LO
fonte
1
a melhor resposta
rcorbellini 19/03/19
9

Para mim

object Hello {
   const val MAX_LEN = 20
}

foi muito clichê. Simplesmente coloquei os campos finais estáticos acima da minha classe assim

val MIN_LENGTH = 10

class MyService{
}
Simon Ludwig
fonte
2
Nos casos em que você não precisa que a constante seja exposta fora do arquivo (por exemplo, Java private), essa definição é a mais concisa.
javaxian