1

所以我有下面的代码,用 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)
        }
    }
}

非常感谢!

4

2 回答 2

3

您需要做两件事才能使其正常工作

  1. 移动MANDATORY_PARAMS到伴随对象中。伴生对象就像 Java 中类的静态部分。并且MANDATORY_PARAMSstatic final在Java中。

  2. MANDATORY_PARAMS将from的类型更改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)
        }
    }
}
于 2017-06-30T06:02:07.373 回答
1

MANDATORY_PARAMS在这种情况下是一个实例属性。的每个实例MandatoryParametersValidator都有自己的MANDATORY_PARAMS属性,即使它总是相同的值。

另一方面,伴随对象是单例(就像其他所有对象一样object),它们不绑定到MandatoryParametersValidator. 因此,要访问该属性,您需要将类的实例传递给伴随对象内的函数并读取它具有的属性,或者将您的属性放在伴随对象中。

这就像您无法从 Java 中的静态函数访问实例字段和方法的方式一样。您现在拥有的内容大致相当于以下 Java 代码:

class MandatoryParametersValidator {

    String[] MANDATORY_PARAMS = ...;

    static bool mandatoryParametersHaveBeenProvided(Map<String, String> params) {
        ...
    }

}
于 2017-06-30T06:08:18.253 回答