Kotlin null de Java

Cuando estoy convirtiendo el código de Java de una biblioteca en Kotlin, veo si null comtesting el código de Java y me pregunto cómo convertirlo.

¿Todavía necesito el cheque nulo en Kotlin porque no puedo controlar si Java hará que el object sea nulo?

Digamos que tengo un CameraDevice que podría volverse nulo desde Java

¿Debo definir esto así ..

private lateinit var mCameraDevice: CameraDevice 

y luego no se necesita un cheque nulo o algo así …

 private var mCameraDevice: CameraDevice? = null 

y luego mantener el cheque nulo

 if (mCameraDevice != null) { // do something } 

Nulability en Kotlin me confunde porque siento que no debería tener que lidiar con el nulo y debería usar la opción uno, pero básicamente todas las bibliotecas que uso son Java, así que tengo que lidiar con nulos e ir con la opción dos

Si no está seguro, debería usar mejor los types que aceptan valores null , porque siempre es posible que el código henetworkingado de Java retorne null . Esta versión es la más segura. Si, de lo contrario, sabe que null es imposible, use el tipo que no admite null .

Como está escrito en los documentos :

Cualquier reference en Java puede ser nula, lo que hace que los requisitos de Kotlin de security nula estricta no sean prácticos para los objects provenientes de Java. Los types de declaraciones Java se tratan especialmente en Kotlin y types de plataforma llamados. Las comprobaciones nulas se relajan para dichos types, de modo que las garantías de security para ellos son las mismas que en Java.

Si trabajas con valores devueltos por Java, que crees que nunca serán nulos, causarán NullpointerException en el time de ejecución si trabajas con ellos como types que no NullpointerException nulos.

Java:

 public class Nullable { public String get(){ return null; } } 

Kotlin:

 Nullable().get().length //-> NPE 

testing este mCameraDevice?.yourMethod()

Realizará su método si mCameraDevice no es nulo.

ref: https://kotlinlang.org/docs/reference/null-safety.html#safe-calls

 if (mCameraDevice != null) { // do something } 

¿Qué vas a hacer en el caso del else ? Si la respuesta es "lanzar una exception", simplemente use un tipo que no admite nulos y Kotlin lo hará por usted; de lo contrario, un tipo que admite nulos es razonable.

Además, si mCameraDevice es una var , dentro // do something Kotlin no puede suponer que no es null : ¡algo podría cambiarlo después de la comprobación! Un idioma común es

 mCameraDevice?.let { mCameraDevice -> // do something } 

lateinit está pensado para lo que parece, variable que se inicializa tarde.

Por ejemplo, en android no tienes que evaluar al constructor para una actividad, por lo que lateinit es útil cuando quieres acceder a una variable que sabes que no es nula porque estableces su valor en onCreate sin verificaciones nulas ? ¡ !! o !! es

Por ejemplo:

 class MainActivity : AppCompatActivity() { private lateinit var field: EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) field = findViewById<EditText>(R.id.field) } fun someOtherMethod() { println(field.text) } } 

¿Sin lateinit necesitarías declarar el field como EditText? y luego use todas las opciones de security nula que proporciona Kotlin.

En la interoperabilidad de Java, si un método de biblioteca puede devolver un valor nulo, entonces debería tratarlo como un valor nulo de Kotlin, y acceder a través de la navigation de save someObject?.someMethod o de alguna otra manera segura, como el método let.

 someObject?.let { it.someMethod } // as also pointed out by Alexey Romanov 

Entonces, en su caso, ya que específicamente dice que Java puede proporcionarle un CameraDevice nulo, definitivamente no debe utilizar lateinit para esto, ya que no es el propósito previsto.

  • Pruebas unitarias Rxjava observables que tienen un retraso
  • AssertionError: el package raíz debe inicializarse
  • Crear una class genérica con una matriz de tipo Comparable <T> en kotlin?
  • esta reference en un inicializador perezoso de la propiedad de extensión kotlin
  • Convenciones de nomenclatura de files para Kotlin
  • Sintaxis literal de class para classs parametrizadas en Kotlin
  • Usando la cláusula Kotlin WHEN para <, <=,> =,> comparaciones
  • ¿Por qué algunos methods de configuration de Java se convierten automáticamente en properties de Kotlin pero otros no?
  • Escriba desajuste en ArrayOfNulls con Kotlin
  • Desplazamiento suave en JavaFX TableView
  • Kotlin Cualquiera con lambdas