Kotlin – 对伴侣对象的属性可见性

所以我有下面的代码,写在Kotlin。

我在最后一条指令行( return params.keys.containsAll(MANDATORY_PARAMS) )上收到编译错误,编译器说Unsolved reference: MANDATORY_PARAMS ,但我真的不明白为什么。

我认为伴侣对象应该对他们“保持联系”的类别的属性具有某种可见性。

我能做些什么来解决这个问题? 我怎样才能使MandatoryParametersValidator和它的伴侣对象可见MANDATORY_PARAMS

(免责声明:这段代码正在从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在Java中是static final

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