Kotlin – видимость атрибута для сопутствующего объекта

Поэтому у меня есть код ниже, написанный в Котлине.

Я получаю ошибку компиляции в последней строке инструкции ( return params.keys.containsAll(MANDATORY_PARAMS) ), компилятор говорит Unsolved reference: MANDATORY_PARAMS , но я действительно не понимаю почему.

Я думал, что объекты-компаньоны должны иметь какую-то видимость в атрибутах классов, к которым они «ведут компанию».

Что я могу сделать, чтобы решить эту проблему? Как я могу сделать MANDATORY_PARAMS видимыми как MandatoryParametersValidator и его сопутствующий объект?

(отказ от ответственности: этот код переносится с Java на Kotlin. В версии Java mandatoryParametersHaveBeenProvided используется как статический метод в том же классе.)

 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) } } } 

Большое спасибо!

Вам нужно сделать две вещи, чтобы получить эту работу

  1. Переместите MANDATORY_PARAMS в объект-компаньон. Сопутствующий объект похож на статические части класса в Java. И MANDATORY_PARAMS были бы static final в Java.

  2. Измените тип MANDATORY_PARAMS из Array<String> в List<String> (так как containsAll требует Collection .)

Фиксированный код выглядит следующим образом.

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

MANDATORY_PARAMS – это свойство экземпляра в этом случае. Каждый экземпляр MandatoryParametersValidator будет иметь свое собственное свойство MANDATORY_PARAMS , хотя оно всегда будет одинаковым.

С другой стороны, объекты-компаньоны – это синглтоны (как и любой другой object ), и они не привязаны ни к какому конкретному экземпляру MandatoryParametersValidator . Поэтому для доступа к этому свойству вам необходимо передать экземпляр класса функции внутри объекта-компаньона и прочитать свойство, которое у него есть, или поместить свое свойство внутри объекта-компаньона.

Это точно так же, как вы не можете получить доступ к полям и методам экземпляра из статической функции в Java. То, что у вас сейчас, примерно эквивалентно этому Java-коду:

 class MandatoryParametersValidator { String[] MANDATORY_PARAMS = ...; static bool mandatoryParametersHaveBeenProvided(Map<String, String> params) { ... } } 
Intereting Posts
Проверить значение null в функции карты в Котлине почему kotlin lambda декомпилируется в java-код (Function0) null.INSTANCE Инфиксная нотация и с (…) не работают, как я ожидал Эффективные перечисления в Котлине с обратным поиском? Упрощенный или более функциональный способ соединения объектов в Котлине Возможно ли изменить порядок кнопок навигационной панели в android? что это "it <= ''" в функции строчной строки означает здесь Преобразование функции Scala в функцию Котлина kotlin setter infinte рекурсия Почему прокрутка ViewPager перед тем, как изменить его заполнение и pagemargin, полностью подвела его? В инъекции зависимостей Kodein, как вы можете вставлять экземпляры Kodein в экземпляры? Как получить необязательный <String> из String? и Строка в Котлине Разделить строку на каждый n символов Kotlin встроенное ключевое слово, вызывающее IntelliJ IDEA Отчетность о покрытии 0% Я хочу изменить фон после нажатия кнопки в android с kotlin