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) } } }
非常感谢!
你需要做两件事才能做到这一点
-
将
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
),它们不绑定到MandatoryParametersValidator
任何特定实例。 因此,要访问该属性,您需要将类的实例传递给伴随对象中的函数,并读取它所具有的属性,或者将您的属性放在伴随对象中。
这就像您不能从Java中的静态函数访问实例字段和方法一样。 你现在拥有的东西大致相当于这个Java代码:
class MandatoryParametersValidator { String[] MANDATORY_PARAMS = ...; static bool mandatoryParametersHaveBeenProvided(Map<String, String> params) { ... } }
- 为什么AtomicInteger在Kotlin中是抽象的? (它在Java中工作正常)
- 在java中实现一个kotlin接口
- 我怎样才能在Kotlin中得到一个随机数字?
- 如何更改IntelliJ上的Kotlin编译器版本?
- Kotlin:在Linux上加密的家庭:java.io.FileNotFoundException(文件名太长)
- Gson反序列化JSON。 java.lang.RuntimeException:无法调用具有根本原因的public com.derp.procedure.model.SkeletonElement(),无参数)
- 如何判断我的Spring启动应用程序是否处于调试模式?
- Jacoco覆盖率和Kotlin默认参数
- 与房间的多对多关系导致错误:实体和Pojos必须有一个可用的公共构造函数