[英]Kotlin - attribute visibility to companion object
所以我有下面用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)
}
}
}
非常感谢!
您需要做两件事才能使它正常工作
将MANDATORY_PARAMS
移到伴随对象中。 伴随对象就像Java中类的静态部分。 并且MANDATORY_PARAMS
在Java中将是static final
。
将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
(就像其他所有object
),并且不与MandatoryParametersValidator
任何特定实例绑定。 因此,要访问该属性,您需要将类的实例传递给伴随对象内的函数并读取其具有的属性,或者将您的属性放入伴随对象内。
就像您无法从Java中的静态函数访问实例字段和方法的方式一样。 您现在拥有的内容大致等同于以下Java代码:
class MandatoryParametersValidator {
String[] MANDATORY_PARAMS = ...;
static bool mandatoryParametersHaveBeenProvided(Map<String, String> params) {
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.