Kotlin: atribuye visibilidad al object complementario

Así que tengo el siguiente código, escrito en Kotlin.

return params.keys.containsAll(MANDATORY_PARAMS) un error de compilation en la última línea de instrucciones ( return params.keys.containsAll(MANDATORY_PARAMS) ), el comstackdor dice Unsolved reference: MANDATORY_PARAMS , pero realmente no entiendo por qué.

Pensé que se suponía que los objects acompañantes tenían algún tipo de visibilidad de los attributes de las classs a las que "se atienen".

¿Qué podría hacer para resolver esto? ¿Cómo podría hacer MANDATORY_PARAMS visible para MandatoryParametersValidator y su object complementario?

(descargo de responsabilidad: este código se está migrando de Java a Kotlin. En la versión de Java, mandatoryParametersHaveBeenProvided solía ser un método estático en la misma class).

 import javax.validation.ConstraintValidator import javax.validation.ConstraintValidatorContext class MandatoryParametersValidator : ConstraintValidator<EnforceMandatoryParameters, Map<String, String>> { val MANDATORY_PARAMS = arrayOf("bookingReference", "lastName") override fun initialize(constraintAnnotation: EnforceMandatoryParameters?) { // do nothing } override fun isValid(params: Map<String, String>, context: ConstraintValidatorContext?): Boolean { MANDATORY_PARAMS .filter { !params.containsKey(it) } .forEach { parameterName -> context?.disableDefaultConstraintViolation() context?.buildConstraintViolationWithTemplate("Mandatory parameter $parameterName is missing.")?.addConstraintViolation() } return mandatoryParametersHaveBeenProvided(params) } companion object { fun mandatoryParametersHaveBeenProvided(params: Map<String, String>) : Boolean { return params.keys.containsAll(MANDATORY_PARAMS) } } } 

¡Muchas gracias!

Tienes que hacer dos cosas para que esto funcione

  1. Mueva MANDATORY_PARAMS al object complementario. El object complementario es como las partes estáticas de la class en Java. Y MANDATORY_PARAMS sería static final en Java.

  2. Cambie el tipo de MANDATORY_PARAMS de Array<String> a List<String> (ya que containsAll requires a Collection ).

El código fijo se ve así.

  ... companion object { val MANDATORY_PARAMS = listOf("bookingReference", "lastName") fun mandatoryParametersHaveBeenProvided(params: Map<String, String>) : Boolean { return params.keys.containsAll(MANDATORY_PARAMS) } } } 

MANDATORY_PARAMS es una propiedad de instancia en este caso. Cada instancia de MandatoryParametersValidator tendrá su propia propiedad MANDATORY_PARAMS , aunque siempre tendrá el mismo valor.

Los objects acompañantes, por otro lado, son simples (al igual que cualquier otro object ) y no están vinculados a ninguna instancia específica de MandatoryParametersValidator . Por lo tanto, para acceder a esa propiedad, debe pasar una instancia de la class a la function dentro del object complementario y leer la propiedad que tiene, o poner su propiedad dentro del object complementario.

Esto es exactamente como la forma en que no puede acceder a los campos y methods de instancia desde una function estática en Java. Lo que tienes ahora es más o less equivalente a este código de Java:

 class MandatoryParametersValidator { String[] MANDATORY_PARAMS = ...; static bool mandatoryParametersHaveBeenProvided(Map<String, String> params) { ... } } 
  • ¿Cómo puedo declarar un parámetro de function que puede ser una cadena o una function en Kotlin?
  • Smart Cast no funciona como se esperaba
  • ¿Cómo implementar esta interfaz Java en Kotlin?
  • ¿Cómo se usa Flowable.generate de Kotlin?
  • ¿Cómo usar SQLite en Kotlin / Native?
  • Anular setter para la variable definida en el constructor pnetworkingeterminado
  • ¿No puede haber una devolución dentro de un Runnable SAM en Kotlin?
  • Kotlin Vertx Type Mismatch encontrado Future <Unit> expected Handler <AsyncResult <Void >>
  • Clases de datos en Kotlin
  • 'x' no es una function al pasar parameters en Kotlin Javascript
  • Kotlin utiliza la interfaz de callback de Java