Kotlin no permite esto:
private lateinit var port: Int;¿Qué puedo usar para marcar un valor entero como permitir lateinit?
Entiendo por qué esto no funciona (Int es primitivo), ¿necesito saber qué usar en su lugar ?
Editar 1
No es un duplicado de esto porque quiero saber qué usar en este caso, no por qué sucede: ¿Por qué Kotlin no permite usar lateinit con tipos primitivos?
Editar 2 Según lo sugerido por @Roland a continuación: BitInteger funciona para mí:
private lateinit var port: BigInteger;Solo lo estoy usando para generar una URL, así que realmente solo lo necesito en una concatenación de cadenas.
Algunas variantes me vienen a la mente, pero dependiendo de cómo lo uses más adelante, ninguna puede ser adecuada para ti.
simplemente use un valor predeterminado, por ejemplo:
var port : Int = 8080 use algún otro tipo de Number en lugar de Int , por ejemplo
class Server { lateinit var port : Number } Luego puede llamar a port.toInt() si lo necesita. Pero: hay muchos tipos de Number , por lo que reducirlo a, por ejemplo, BigInteger podría tener sentido. De lo contrario, podría obtener objetos que no desea aceptar en primer lugar.
usando Delegates.notNull
var port : Int by Delegates.notNull() pero: a pesar de que ahorra su valor null , no puede verificar si la variable se ha inicializado, por lo que solo tiene que lidiar con una excepción tan pronto como quiera acceder a ella ... no es muy agradable, creo. .. pero si está seguro de obtener un valor, entonces eso también podría estar bien para usted.
solo usa Int? y omita el lateinit , por ejemplo:
class Server { var port : Int? = null } En lugar de ::port.isInitialized , solicitaría port != null , pero: necesita manejar el posible valor null ahora, pero con ? eso no debería ser un gran problema.
utilizar Int? con Delegates.vetoable en caso de que no quiera aceptar valores null después de obtener su primer valor, haciéndolo básicamente algo así como lateinit ;-)
class Server { var port : Int? by Delegates.vetoable(null as Int?) { _, _, newValue -> newValue != null } } y verifique nuevamente usando port != null , que ahora se comporta de manera similar a ::port.isInitialized
No es que sea un gran admirador de los dos últimos, ya que presentan null nuevamente, pero dependiendo de lo que hagas, podría estar perfectamente bien...
A medida que agregó algo sobre la concatenación de String , ¿usaría aún más Int? aquí. Entonces todavía puedes usar algo como:
url = "$host${port?.let { ":$it" }?:""}" // or: url = port?.let { "$host:$it" } ?: host // or url = listOfNotNull(host, port).joinToString(":") Lo mismo no puede ser realmente más fácil con ::port.isInitialized ?
No sé cuál es la solución perfecta que está buscando, pero lo hago así (en caso de que se vea obligado a usar un tipo primitivo):
class Example{ private var _port: Int? = null var port:Int get() = this._port!! set(i) { _port = i } }Al menos esto le permite usar la propiedad como si no fuera anulable. ¡La mejor solución que encontramos para nosotros hasta ahora!
Si su proyecto no es multiplataforma, la solución obvia sería
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") lateinit var i: java.lang.Integer que tiene una correspondencia uno a uno con los valores Int (a diferencia de BigInteger ).